C++进阶(二)

深拷贝与浅拷贝的区别

深拷贝和浅拷贝都是指在对象复制时如何处理所包含的指针成员。

  1. 浅拷贝只是把原对象中的指针成员的值(即地址)复制到新对象中相应的指针成员中,这样新对象和原对象共享同一块内存。这种情况下,如果新对象和原对象中的指针成员指向同一块内存,在一个对象中内存发生改变时,另一个对象的对应指针成员也会受到影响,可能会引起程序错误。
  2. 深拷贝则在复制对象时,为新对象分配新的内存空间,并将原对象中的所有成员都复制到新对象的相应成员中。这种情况下,新对象和原对象拥有各自独立的内存空间,互不干扰。

简而言之,深拷贝会创建一个全新的对象,将原始对象中的数据复制到新的对象中,而浅拷贝只是创建一个指向相同数据的指针。这两者主要区别在于,浅拷贝只是指向原有内存的另一个指针,而深拷贝则是复制一份原有内存的内容到另一块内存区域,这两者的行为会随着引用对象的赋值、初始化、参数传递和返回等不同场合而有所不同。有时候使用浅拷贝会出现不一致或逻辑错误,因此在编程中要根据实际情况选择使用深拷贝或浅拷贝。

一个类,默认会生成哪些函数

没有显式地定义一个类中的一些特定成员函数,编译器会自动为我们生成一些默认的成员函数。默认生成的函数有:

  1. 默认构造函数(Default Constructor) 如果我们没有定义构造函数,编译器会自动生成一个默认构造函数,它没有参数,也不进行任何操作。

  2. 拷贝构造函数(Copy Constructor) 如果我们没有定义一个拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,用于将一个对象的值复制到另一个对象。它会逐一复制对象的每一个成员变量。

  3. 拷贝赋值运算符(Copy Assignment Operator) 如果我们没有定义一个拷贝赋值运算符,编译器会自动生成一个默认的拷贝赋值运算符,用于将一个对象的值赋给另一个对象。它也会逐一复制对象的每一个成员变量值。

  4. 析构函数(Destructor) 如果我们没有定义析构函数,编译器会自动生成一个默认的析构函数,用于释放资源,清理对象。

需要注意的是,如果我们显式地定义了一个有参构造函数、拷贝构造函数、拷贝赋值运算符或析构函数,编译器就不会再为我们自动生成默认的实现。另外,如果我们想禁止编译器默认生成的某些函数,可以通过将函数声明为私有或删除(C++11 引入)该函数的方式来实现。

需要注意的是,不同编译器对于默认生成的函数的实现可能不完全相同,具体细节可以查看编译器的官方文档。

//定义一个空类

//复制代码
class Empty
{
};


//默认会生成以下几个函数

//无参的构造函数 在定义类的对象的时候,完成对象的初始化工作。
Empty()
{
}

//拷贝构造函数   拷贝构造函数用于复制本类的对象

Empty(const Empty& copy)
{
}

//赋值运算符
Empty& operator = (const Empty& copy)
{
}

//析构函数(非虚)
~Empty()
{
}

 C++ 类对象的初始化顺序,有多重继承情况下的顺序

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