c++类和对象
类中成员变量的初始化
1.static的成员变量只能在类内声明,类外初始化
不能使用缺省参数
对于共有
的static变量:作用域是这个类中,而不是单单一个对象
,所以在创建了两次后他会进行累加
对共有
的访问方式:对象.静态成员
或者类::静态成员
非静态成员是不能这样访问的,只能使用对象进行访问
特别注意,对于private静态对象,是绝对不能访问的,只能写一个函数在类内进行返回
相应的也有静态的成员函数
静态成员函数只能调用静态成员变量
2.内置数据类型,如果没有缺省参数,也没有初始话,将会是任意值
内置数据类型:常见的类型:int,float,long以及各种类型的指针
对于自定义数据类型在初始化时,如果没有初始化,会调用自己的默认构造
3.对于自定义数据类型,在初始化的时候,会调用自己的默认构造函数
4.赋值会进行隐式类型转换
class Son
{
public:Son(){puts("默认构造");}Son(int a1){a = a1;}Son(Son& s){puts("拷贝构造");}
private:int a;
};int main()
{Son son1 = 1;const Son& son = 1;return 0;
}
分析
1.隐式类型转化中间会开一个空间,单独存储这个值,这个值有常性,又因为他的赋值时一个int,所以就可以发生隐式类型转换
2.如果想使用引用就必须要使用const进行修饰,给引用赋予常性
class Son
{
public:Son(){puts("默认构造");}Son(int a1){a = a1;}Son(const Son& s){puts("拷贝构造");}void print(){printf("%d\n", a);}
private:int a;
};
int main()
{Son son1 = (1,2);son1.print();return 0;
}
这种结果下为什么是2
因为这个是逗号表达式,最后的取值是2
class Son
{
public:Son(){puts("默认构造");}Son(int a1,int a2){a = a1;b = a2;}Son(Son& s){puts("拷贝构造");}void print(){printf("%d %d\n", a, b);}
private:int a;int b;
};
int main()
{Son son1 = { 1,2 };son1.print();return 0;
}
使用{}的形式也是可以进行类型转化的
Son s1(1);
Son s2=s1;//这种进行赋值的调用的是拷贝构造
于是这里就产生了一个新的问题拷贝构造能不能不使用&
答案是不能
如果写的不是&,传过去的时候需要调用拷贝构造,在调用拷贝构造的时候还需要调用拷贝构造,最终就会形成套娃的形式
5.编译器会对连续构造进行优化
当构造在同一句中才能进行优化
构造+构造->构造
构造+拷贝构造->构造
拷贝构造+拷贝构造->拷贝构造
特别提醒
拷贝构造一定要加const&
防止出现
这种是不会报错的,一旦写出来了,就很难发现错误
Son(Son& s){s.a = this->a;}