周总结
有关拷贝构造函数的内部实现原理及静态成员变量和静态成员函数
注意点
1.用一个已经实现的对象去实例化另一个对象的时候,不会自动调用构造函数进行初始化,因为你的本意就是复制粘贴,也就不会帮你初始化了,只是用了public区里的拷贝构造函数内部的操作帮你进行复制粘贴,也就带来了下面代码中的 stunum统计处的数据不是学生真实的人数
2.拷贝构造函数的内部实现原理:(const 类名 &t)
疑惑点1:为什么用const
被const修饰的对象不能够再继续修改,成为了一个常量,这就保证了复制拷贝的准确性,防止我们在拷贝构造函数或是其他地方里误操作了导致拷贝不准确。
疑惑点2:为何引用&
*不使用引用时,假设用指针,类名(const 类名 t),当用t1实例化t2时:类名 t2 = t1,t1传入。此时我们要知道拷贝构造函数内部的复制原理,如下代码注释
`//高中学生信息统计`
`//this is Jarvis Chan`
class A
{
public:
A()
{
int x = 0
}
A(const A *t)
{
x = t.x
}
}
疑惑点4:为何需要这个函数
解决当类中有指针时,并且没有该构造函数时,盲目使用一个已经实例化的对象去实例化另一个新对象所导致的报错(具体不说了)
3静态成员变量及函数
//高中学生信息统计
//this is Jarvis Chan
//1.拷贝构造函数
//2.静态成员变量和静态成员函数
#include <iostream>
using namespace std;
//用于统计学生数量(有漏洞,当使用了拷贝构造函数(也就是用一个已经实现的对象去实例化另一个对象时,stnnum不会+1,因为使用该方法不会调用构造函数,也就导致了当我们新实例化一个对象后,这个对象不会自动去调用我们的
int stunum = 0;
class TrueLightStu
{
public:
char name[32];
int score;
//与类同名的构造函数
//在这里对成员对象进行初始化
TrueLightStu()
{
char grade[32] = "xiao";
score = 0;
cout << "his/her name is" << name << "," << "score is:" << score << endl;
stunum ++;
}
//拷贝构造函数
TrueLightStu(const TrueLightStu &T)
{
cout << "TrueLightStu(const TrueLightStu &T)" << endl;
score = T.score;
}
static int get_ad(int age)
{
return age;
}
private:
static int age;
public:
~TrueLightStu()
{
cout << "no"<< endl;}
};
int main()
{
TrueLightStu t1;
t1.score = 100;
t1.get_ad(18);
//由于1和2考试成绩和年龄一样,这里直接用t1初始化t2,通过拷贝构造函数实现
//但由于年龄只能用静态成员函数一个个输入,因此年龄不能直接拷贝
//这里相当于把t1作为参数放入TrueLightStu(const TrueLightStu &T)
//
TrueLightStu t2 = t1;//调用拷贝构造函数,该初始化不调用构造函数
//测试t2
cout << t2.score << endl;
TrueLightStu t3;
cout << stunum << endl;
return 0;
}