c++类和对象

类中成员变量的初始化

1.static的成员变量只能在类内声明,类外初始化不能使用缺省参数
c++类和对象_第1张图片
对于共有的static变量:作用域是这个类中,而不是单单一个对象,所以在创建了两次后他会进行累加
共有的访问方式:对象.静态成员或者类::静态成员
非静态成员是不能这样访问的,只能使用对象进行访问
c++类和对象_第2张图片

特别注意,对于private静态对象,是绝对不能访问的,只能写一个函数在类内进行返回
c++类和对象_第3张图片
相应的也有静态的成员函数
c++类和对象_第4张图片
静态成员函数只能调用静态成员变量

2.内置数据类型,如果没有缺省参数,也没有初始话,将会是任意值

内置数据类型:常见的类型:int,float,long以及各种类型的指针
对于自定义数据类型在初始化时,如果没有初始化,会调用自己的默认构造
c++类和对象_第5张图片
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;
}

c++类和对象_第6张图片
这种结果下为什么是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;
}

使用{}的形式也是可以进行类型转化的
c++类和对象_第7张图片

Son s1(1);
Son s2=s1;//这种进行赋值的调用的是拷贝构造

c++类和对象_第8张图片
于是这里就产生了一个新的问题拷贝构造能不能不使用&
答案是不能

如果写的不是&,传过去的时候需要调用拷贝构造,在调用拷贝构造的时候还需要调用拷贝构造,最终就会形成套娃的形式

c++类和对象_第9张图片
5.编译器会对连续构造进行优化
当构造在同一句中才能进行优化
构造+构造->构造
构造+拷贝构造->构造
拷贝构造+拷贝构造->拷贝构造

特别提醒
拷贝构造一定要加const&
防止出现
这种是不会报错的,一旦写出来了,就很难发现错误

	Son(Son& s)
	{
		s.a = this->a;
	}

你可能感兴趣的:(c/c++,c++,java,开发语言)