山西企业网站建设,wordpress添加视频相册,安徽省芜湖建设定额网站,一个链接打开是表白类和对象#xff08;下#xff09;#xff08;一#xff09;1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字2.static成员2.1概念2.2特性3.匿名对象#x1f31f;#x1f31f;hello#xff0c;各位读者大大们你们好呀#x1f31f;#x1f31f; #x…
类和对象下一1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字2.static成员2.1概念2.2特性3.匿名对象hello各位读者大大们你们好呀 系列专栏【C的学习】 本篇内容再谈构造函数static成员匿名对象 ⬆⬆⬆⬆上一篇类和对象中二 作者简介轩情吖请多多指教( •̀֊•́ ) ̖́- 1.再谈构造函数
1.1构造函数体赋值
虽然构造函数调用之后对象中已经有了一个初始值但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值而不能称作初始化。因为初始化只能初始化一次而构造函数体内可以多次赋值。
1.2初始化列表
初始化列表以一个冒号开始接着是一个以逗号分隔的数据成员列表每个“成员”后面跟一个放在括号中的初始值或表达式。 注意 ①每个成员变量在初始化列表中只能出现一次初始化只能初始化一次 ②类中包含以下成员必须放在初始化列表位置进行初始化 引用变量 const成员变量 自定义类型成员且该类没有默认构造函数时
#define _CRT_SECURE_NO_WARNINGS 1
#include iostream
using namespace std;
class Time
{
public:Time(int a):_hour(0),_minute(0),_second(0){}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year0,int month0,int day0):_year(year),_month(month),_day(day),{}
private:int _year;int _month;int _day;Time _t;
};
int main()
{return 0;
}大家可以试一下会报错的因为这个类没有默认构造函数我们必须在初始化列表来亲自初始化它才行 ③尽量使用初始化列表初始化因为不管你是否使用初始化列表对于自定义类型成员变量一定会先使用初始化列表初始化 其实本质上哪个对象调用构造函数初始化列表是它所有成员变量定义的位置 不管是否显示在初始化列表写编译器对于每个变量都会初始化列表处定义初始化 如果成员变量有缺省值在初始化时没有显式初始化则使用缺省值反之则使用自己设定的初始值 ④成员变量在类中声明次序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后顺序无关
#define _CRT_SECURE_NO_WARNINGS 1
#include iostream
using namespace std;
class Time
{
public:Time(int a1):_hour(0),_minute(0),_second(0){}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year 0, int month 0, int day 0):_day(_year),_year(year),_month(month){}
private:int _year;int _month;int _day;
};
int main()
{Date dl;return 0;
}大家可以去试一下
1.3explicit关键字
构造函数不仅可以构造于初始化对象对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数还具有类型转换作用 它其实本质上就是当中产生了一个临时的匿名对象把1作为参数构造临时的匿名对象然后临时的匿名对象再拷贝构造给d1但是编译器会进行优化把构造拷贝优化成直接构造 在C11中允许多个参数形成隐式类型转换 如果想要禁止构造函数的隐式转换用explicit修饰构造函数
2.static成员
2.1概念
声明为static的类成员称为类的静态成员用static修饰的成员变量称之为静态成员变量用static修饰的成员函数称之为静态成员函数。静态成员变量一定要在类外进行初始化
class Date
{
public:Date(int year1, int month1, int day1):_day(day),_year(year),_month(month){}static int Print()//静态成员函数{return count;}
private:static int count;//静态成员变量int _year;int _month;int _day;
};
int Date::count 0;//在类外初始化2.2特性
①静态成员为所有类对象所共享不属于某个具体的对象存放在静态区 ②静态成员变量必须在类外定义定义时不添加static关键字类中只是声明 ③类静态成员即可用类名::静态成员或者对象.静态成员来访问
#define _CRT_SECURE_NO_WARNINGS 1
#include iostream
using namespace std;
class Date
{
public:Date(int year1, int month1, int day1):_day(day),_year(year),_month(month){}
//private:static int count;//静态成员变量int _year;int _month;int _day;
};
int Date::count 0;//在类外初始化
int main()
{//前提是成员用的是public访问限定符Date d;cout Date::count endl;cout d.count endl;Date* p NULL;cout p-count endl;//因为单纯就是访问类内部的count静态成员变量而count也不是某个对象所属的//是所有类对象共享的他存在静态区所以说不需要解引用直接去静态区找cout sizeof(Date) endl;return 0;
}④静态成员函数没有隐藏的this指针不能访问任何非静态成员
#define _CRT_SECURE_NO_WARNINGS 1
#include iostream
using namespace std;
class Date
{
public:Date(int year1, int month1, int day1):_day(day),_year(year),_month(month){}static void Print()//静态成员函数{//_year0;count;cout count endl;}
//private:static int count;//静态成员变量int _year;int _month;int _day;
};
int Date::count 0;//在类外初始化
int main()
{Date d;d.Print();return 0;
}
⑤静态成员也是类的成员受public、protected、private访问限定符的限制
3.匿名对象 他的特点就是不用取名字但是他的生命周期只有这一行并且它具有常属性 可以看到它在使用完后就调用了析构函数 类和对象下一的知识大概就讲到这里啦博主后续会继续更新更多C的相关知识干货满满如果觉得博主写的还不错的话希望各位小伙伴不要吝啬手中的三连哦你们的支持是博主坚持创作的动力