C++ Day10-面向对象F 拷贝构造函数

170 阅读1分钟
1. 什么是拷贝构造函数?如何自定义拷贝构造函数?
  • 拷贝构造函数是构造函数的一种(在创建对象的时候自动调用)
  • 当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化
class Animal {
public:
 int m_age;
 Animal() {
     cout << "普通构造函数Animal::Animal()" << endl;
 };
 Animal(int age):m_age(age) {
     cout << "普通构造函数Animal::Animal(int age)" << endl;
 };
 
 Animal(const Animal &animal) {
     m_age = animal.m_age;
     cout << "拷贝构造函数Animal::Animal(const Animal &animal)" << endl;
 }
};

int main() {
 Animal a1;
 Animal a2 = a1;
 return 0;
}
2. C 语言中字符串的本质是什么?如何计算字符串的长度?
  • 是字符数组,以 \0 结尾
  • 使用 strlen()可以获得字符的长度(并不会把 \0 计算到长度中,但是内存中实实在在存在)
int main() {
 // 下面两个字符串存储结构
 const char *name = "bmw";
 char name2[] = {'b','m','w','\0'};
 // 下面两个字符串是打印相同
 cout << name << endl;
 cout << name2 << endl;
 //  长度打印:3
 cout << strlen(name) << endl;
 cout << strlen(name2) << endl;
 return 0;
}
3. 如果是一个堆空间对象内部的指针成员,指向栈空间对象,这样会存在什么问题?要怎么做?
  • 栈空间的对象随时会被释放,所以堆空间内部的指针成员使用将会非常不安全
  • 通常需要①在自定义构造函数中,对传入对象进行深拷贝 ②在拷贝构造函数中,对传入对象进行深拷贝 ③在析构函数中,对传入的对象进行释放
  • 拷贝内存值使用 strcpy(source, destinate)
4. 系统实现的拷贝,都是浅拷贝(shallow copy)吗?
  • 系统实现的拷贝,都是浅拷贝(shallow copy),这句话很重要