前言:
类自己实现的成员函数主要分三个大类:1.构造类、2.运算符重载类、3.析构类。三个大类帮助用户进行初始化,在类对象使用的优化,以及销毁
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证
每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
构造函数有如下特性:
当我们定义一个类时如果没有定义构造函数,类会自动生成两个构造函数,分别是构造函数和拷贝构造函数
1.系统默认生成一个构造函数,该函数没有参数列表,如果在类的定义中声明变量时添加了缺省值,则会在默认生成的构造函数中对缺省值赋值
class A
{
int a=1;
}
int main()
{
A a;
cout<<a.a<<endl;
}
2.系统的默认构造函数处理内置类型和自定义类型的逻辑不同
对于内置类型,系统默认构造不会处理;对于自定义类型系统默认构造会调用自定义类型的构造函数
拷贝构造函数是一种特殊的构造函数,用于在创建新对象时,以已存在的同类型对象作为参数进行初始化。拷贝构造函数的有如下特点:
1.形参是同类型对象的引用: 拷贝构造函数的形参通常是同类型对象的引用,这样可以方便地将一个对象的值复制到另一个对象中。
class MyClass {
public:
// 拷贝构造函数
MyClass(const MyClass& other) {
// 进行成员变量的复制
// 可以使用深拷贝或浅拷贝,具体取决于类的需求
}
};
2.用于对象的初始化: 拷贝构造函数主要用于在创建一个新对象时,以另一个对象的值来初始化新对象。
MyClass obj1; // 创建对象 obj1
MyClass obj2(obj1); // 使用拷贝构造函数,将 obj1 的值复制给 obj2
3.编译器默认生成: 如果你没有显式地提供拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。默认的拷贝构造函数进行的是浅拷贝,即成员变量的值被直接复制。
4.深拷贝和浅拷贝: 如果类中包含指针成员或资源,你可能需要实现自定义的拷贝构造函数以进行深拷贝,以确保在新对象中复制的是新的资源而不是简单的指针复制
class MyClass {
public:
int* data;
// 自定义拷贝构造函数,执行深拷贝
MyClass(const MyClass& other) {
data = new int(*other.data);
}
};
C++的类的运算符重载提供了一种强大的工具,允许程序员以更自然、直观的方式操作自定义类型的对象,从而提高代码的可读性和灵活性
C++中,如果你没有显式地提供类的等号运算符重载,编译器会为类生成一个默认的等号运算符重载。这个默认的等号运算符重载执行的是成员逐个复制的操作,即浅拷贝。以下是默认生成的等号运算符重载的特点:
成员逐个复制: 默认的等号运算符重载会逐个复制类的每个成员变量的值。如果成员变量是内置类型或者具有默认的等号运算符重载的类类型,这个操作是安全的。
浅拷贝: 默认生成的等号运算符重载进行的是浅拷贝。如果类包含指针成员,这可能导致问题,因为它只会复制指针的值,而不是指向的数据。在这种情况下,可能需要显式地提供自定义的等号运算符重载来执行深拷贝。
返回类型: 默认生成的等号运算符重载的返回类型是类的引用,以支持连续赋值操作。
以下是一个示例,演示了没有显式提供等号运算符重载的情况下,编译器生成的默认等号运算符重载:
class MyClass {
public:
int data;
// 没有显式提供等号运算符重载,编译器生成默认的
};
int main() {
MyClass obj1, obj2;
obj1.data = 10;
// 默认生成的等号运算符重载会逐个复制成员变量的值
obj2 = obj1;
// ...
return 0;
}
在C++中,类默认的&运算符重载通常是用于获取对象的地址。如果你没有显式地提供类的&运算符重载,编译器会为你生成一个默认的&运算符重载。默认的&运算符重载的特点有:
1.返回对象的地址: 默认的&运算符重载返回对象的地址,即指向对象的指针。这使得你可以使用&运算符来获取对象在内存中的地址。
class MyClass {
public:
int data;
// 没有显式提供&运算符重载,编译器生成默认的
};
int main() {
MyClass obj;
MyClass* ptr = &obj; // 使用&运算符获取对象的地址
// ...
return 0;
}
2.系统默认生成: 如果你没有提供自定义的&运算符重载,编译器会默认生成一个合适的版本。这个版本会返回对象的地址,并允许你在代码中使用&运算符来取地址。
大多数情况下,你不需要显式地提供自定义的&运算符重载,因为默认的行为通常就是你想要的。
在C++中,类默认的const&运算符重载通常是用于创建对象的常量引用。如果你没有显式提供类的const&运算符重载,编译器会为你生成一个默认的const&运算符重载。默认的const&运算符重载的特点有:
1.返回常量引用: 默认的const&运算符重载返回对象的常量引用,使得你可以在代码中使用对象的常量引用,而不改变对象本身。
class MyClass {
public:
int data;
// 没有显式提供const&运算符重载,编译器生成默认的
};
int main() {
MyClass obj;
const MyClass& ref = obj; // 使用const&运算符创建对象的常量引用
// ...
return 0;
}
2.系统默认生成:如果你没有提供自定义的const&运算符重载,编译器会默认生成一个合适的版本。这个版本返回对象的常量引用,并允许你在代码中使用const关键字来创建对象的常量引用
析构函数是特殊的成员函数,其特征如下:
在C++中,如果你没有显式提供类的析构函数,编译器会生成一个默认的析构函数。默认的析构函数具有以下特点:
1,自动调用: 默认析构函数会在对象生命周期结束时自动被调用。通常,对象在超出其作用域时或通过delete释放动态分配的内存时会调用析构函数。
2,对内置类型和自定义类型的不同处理: 默认析构函数会逐个销毁类的成员变量。对于内置类型的成员,它们会被简单地销毁。对于自定义类型的成员,它们的析构函数会被递归调用。