C++类的默认成员函数

C++类有六个默认的成员函数,分别是构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、&运算符重载函数、const &运算符重载函数。

下面分别说明:

定义一个class CTestClass{};类。

1、构造函数

类实例化时执行的函数。

CTestClass();

2、析构函数

类释放时执行的函数。

~CTestClass();

3、拷贝构造函数

CTestClass(const CTestClass& cls);

默认的拷贝构造函数执行的是浅拷贝,即对成员变量直接按值拷贝(若成员变量不存在指针或申请动态内存的情况下深浅拷贝没有区别)。拷贝构造函数传递参数为const是为了防止函数参数传值时复制拷贝(执行拷贝构造函数),因为本身已经是拷贝构造函数,若传递参数再执行拷贝构造函数则会陷入死循环。

4、赋值运算符重载函数

CTestClassExt& operator=(const CTestClassExt& cls);

5、&运算符重载函数

CTestClassExt* operator&();

6、const &运算符重载函数

const CTestClassExt* operator&()const;


测试代码:

定义了两个类,CTestClass和CTestClassExt。CTestClassExt对默认的成员函数做了修改。

CTestClass定义:

class CTestClass  
{
public:
CTestClass();
~CTestClass();


public:
int m_iValue;


};

CTestClass::CTestClass()
{


}


CTestClass::~CTestClass()
{


}

CTestClassExt定义:

class CTestClassExt  
{
public:
CTestClassExt();
CTestClassExt(const CTestClassExt& cls);
virtual ~CTestClassExt();


CTestClassExt& operator =(const CTestClassExt& cls)
{
m_iValue = cls.m_iValue + 2;


return *this;
}


CTestClassExt* operator&() 
{
m_iValue+=3;


return this;
}


const CTestClassExt* operator&()const 
{
//m_iValue+=4;//const函数无法修改成员变量的值


return this;
}


public:
int m_iValue;


};

CTestClassExt::CTestClassExt()
{
m_iValue = 10;
}


CTestClassExt::CTestClassExt(const CTestClassExt& cls)
{
m_iValue = cls.m_iValue + 1;
}


CTestClassExt::~CTestClassExt()
{


}

main函数测试代码:

int main(int argc, char* argv[])
{
CTestClassExt cls_ext;
CTestClass cls;


printf("cls.m_iValue = %d\r\n", cls.m_iValue);//未初始化的值
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//构造函数中初始化


cls.m_iValue = 0;
CTestClassExt cls_ext2(cls_ext);//拷贝构造函数
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//构造函数中初始化
printf("cls_ext2.m_iValue = %d\r\n", cls_ext2.m_iValue);//通过拷贝构造函数初始化,拷贝构造函数中对值+1


CTestClassExt cls_ext3 = cls_ext;//这种风格执行拷贝构造函数
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//构造函数中初始化
printf("cls_ext3.m_iValue = %d\r\n", cls_ext3.m_iValue);


cls_ext3 = cls_ext;//通过=号操作符初始化
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//构造函数中初始化
printf("cls_ext3.m_iValue = %d\r\n", cls_ext3.m_iValue);//通过=号操作符初始化,拷贝构造函数中对值+2


//&
printf("&cls_ext = %d\r\n", &cls_ext);
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//&的左值运算+3


cls_ext.m_iValue = 10;
//const &由于默认的函数定义为const函数,因此不能修改变量,无法测试验证。


return 0;
}

### C++ 默认成员函数 #### 构造函数与析构函数 当定义一个时,如果没有显式声明任何构造函数,则编译器会提供一个无参的默认构造函数[^1]。这个默认构造函数不执行任何特殊操作;它仅用于初始化新创建的对象。 同样地,在未自定义的情况下,编译器也会为每个生成一个默认的析构函数。该析构函数负责清理资源并销毁对象实例。需要注意的是,一旦程序员提供了自己的版本(无论是带参数还是不带),那么这些默认行为就会被覆盖。 #### 复制控制成员函数 除了基本的构造和析构外,还有三个重要的复制控制系统成员: - **拷贝构造函数**:用来通过已存在的对象来初始化另一个同型的对象; - **赋值运算符 (`operator=`)** :允许两个不同对象之间相互赋值; - **swap 函数** (虽然不是严格意义上的“默认”,但在STL容器中非常常见) 对于 `const` 对象而言,其成员函数默认情况下也是 `const` 的,这意味着它们不会修改对象的状态,并且只能调用其他标记为 `const` 的方法[^2]。 #### 自动调用机制 某些特定的操作会触发上述提到的各种默认成员函数的自动调用。例如,当你将一个对象传递给某个函数作为实参或将返回的结果存储到一个新的变量里时,实际上就是在背后悄悄地运用到了拷贝构造函数[^3]。 然而,值得注意的一点是关于对象生命周期管理方面的问题——即所谓的“先有鸡还是先有蛋”的困境。这指的是在实际编程过程中可能会遇到的情况:一方面我们需要依赖于已经构建好的对象去访问成员属性或方法;另一方面却又不得不依靠那些尚未完全建立起来的东西来进行必要的准备工作[^4]。 ```cpp class MyClass { public: // 编译器提供的默认构造函数 MyClass() {} // 用户定义的构造函数 MyClass(int value) : m_value(value) {} private: int m_value; }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值