其实类也分类,类分为两种一种是聚合类就是没有自定义构造函数的类,就算你写默认构造函数也算自定义
这种聚合类,初始化可以用结构体的花括号方法初始化,初始化过程叫在聚合类初始化
第二个类就是非聚合类,就是类有自定义函数,不能聚合初始化,此时非聚合类初始化只能用构造函数
类的成员在类的初始化有三种方法,聚合类初始化,非聚合类构造函数给成员初始化,C++11后的初始化
1.聚合类构造函数给成员初始化
非聚合类满足有四个条件
1.类没有自定义构造函数,自己手写默认构造函数也算自定义
2.没有保护和私有的非静态成员,非静态成员就是没有加static的成员
3.没有虚函数
4.这个类没有基类,没有基类的意思就是这个类没有父类,父类就是基类意思,派生类就是子类意思
class student
{
public: //第二个条件没有保护和私有的非静态成员
int age ; //第一个条件没有自定义构造函数
int sno; //第三,四个条件,没有继承和虚函数
};
int main()
{
student a={10,10086,"blue"}; //聚合类创建对象初始化就像结构体一样间接定义变量花括号赋值
studrnt a{10,10086,"blude}; //聚合初始化不带等于就花括号也可以
return 0; //注意成员顺序:大括号里的值,必须和类里面成员声明顺序一一对应
}
关于C++聚合类的知识点:
1.聚合是一个数据类型的名词,就是聚合类型
聚合类型有三个 一个是数组 ,一个是满足四个条件的聚合类,一个是C语言的结构体
C语言结构体是聚合类的一种
当然满足四个条件的聚合类和C语言结构体是属于同一类,不属于数组那一类,我只是便于区分想起
2.只要是聚合类型创建对象都可以用等于加花括号初始化,并且都不调用构造函数
聚合创建对象初始化虽然说要带等于和花括号秒其实不带等于也可以
所以数组和聚合类,结构体
3.同时结构体为什么也能用等于花括号初始化因为他也算聚合类型
4.但是反过来,等于和花括号在代码里面不一定就是聚合类型的初始化
在C++11标准里面,非聚合类创建对象也可以用等于和花括号初始化!!!
2.非聚合类构造函数给成员初始化
非聚合类初始化只能用构造函数,a.age=100,那叫赋值
非聚合类初始化有两种
第一种构造函数初始化列表初始化
第二种C++11后的定义变量处初始
类的赋值有四种
第一种在构造函数里面直接给变量赋值
第二种在自定义函数里面直接给变量赋值
第三种类外部用点运算符或者箭头运算符
第四种在其他特殊成员函数里面
但是不能直接把赋值干巴巴写在类里面
说白了非聚合类构造函数在类里面的初始化就只有初始化列表,有值还有一个构造函数体内赋值还有个C++11后
3.C++11后的初始化
类的成员在定义变量的时候初始化必须是C++11标准才可以
如
class student
{
public:
int age =18; //直接给成员初始化,但是这种方法只有在C++11标准才可以
int sno=10086;
private:
int func()
{
cout
return 0;
}
}
我们可以用构造函数成功初始化类,这个类的初始化是在类里面就是直接所有成员初始化,这是直接初始化
那我想间接从类外面给类的任何权限成员初始化或者赋值呢,甚至给私有成员初始化赋值
保护和私有无法直接访问,但是可以通过访问类的构造函数和自定义函数对里面私有和保护成员访问
可以理解成只要先跑进了公有里面,理论上可以对类的私有和保护进行间接访问,一般通过跑到公有的构造和自定义函数
成员权限只是针对于直接权限,通过函数调用是间接,此时权限没有用