文章目录
- 1.默认成员函数思维导图
- 2.构造函数
- 定义
- 特性
- 2.析构函数
- 定义
- 特性
- 3.拷贝构造函数
- 定义
- 特性
- 4.赋值构造函数
- 定义
- 特性
- 5.重载取地址运算符
- 定义
- 特性
- 6.重载const取地址运算符
- 定义
- 特性
1.默认成员函数思维导图
2.构造函数
定义
在面向对象编程中,构造函数是一种特殊的方法,用于在创建对象时初始化对象的属性或数据成员。它通常与类一起使用,并且在实例化对象时自动调用。
class MyClass
{
public:
MyClass()
{
{
cout << "默认构造函数" << endl;
}
}
MyClass(int x)
{
cout << "带参数的构造函数" << endl;
}
};
int main()
{
MyClass obj1; // 调用默认构造函数
MyClass obj2(10); // 调用带参数的构造函数,将10作为参数传递
return 0;
}
特性
- 函数名与类型相同
- 无返回值
- 对象实例化时编译器自动调用对应的构造函数
- 构造函数可以重载
- 如果用户没有定义构造函数,编译器会自动生成一个无参的默认构造函数;如果用户定义了构造函数,编译器将不再生成。
- 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
2.析构函数
定义
与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
class MyClass {
public:
// 构造函数
MyClass();
// 析构函数
~MyClass();
// 成员函数
void doSomething();
private:
int _data;
// ...
};
// 构造函数的定义
MyClass::MyClass() {
// 构造函数的实现
}
// 析构函数的定义
MyClass::~MyClass() {
// 析构函数的实现
}
// 成员函数的定义
void MyClass::doSomething() {
// 成员函数的实现
}
特性
- 析构函数名是在类名前加上字符~
- 无参数无返回值类型
- 一个类只能有析构函数,若未显式定义,系统会自动生成默认的析构函数。(析构函数不能重载)
- 对象生命周期结束时,C++编译系统自动调用析构函数
- 编译器生成的默认析构函数,对自定类型成员调用它的析构函数
- 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数;有资源申请时,一定要写,否则会造成资源泄露。
3.拷贝构造函数
定义
拷贝构造函数是一种特殊的构造函数,用于将一个对象的值复制到另一个对象中。它通常用于对象间的赋值和传递,以确保新对象具有与原对象相同的状态和数据。
拷贝构造函数的语法与普通构造函数相同,但它的参数是一个同类对象的常引用。例如:
class MyClass {
public:
MyClass(); // 默认构造函数
MyClass(const MyClass& other); // 拷贝构造函数
};
在这个例子中,MyClass
类有一个默认构造函数和一个拷贝构造函数。拷贝构造函数的参数是一个同类对象的常引用,用于指定要复制的对象。
当您使用拷贝构造函数创建一个新对象时,它会以与原对象相同的值初始化新对象。例如:
MyClass obj1;
MyClass obj2 = obj1; // 调用拷贝构造函数
在这个例子中,我们使用拷贝构造函数将obj1
的值复制到了obj2
中。这是通过将obj1
作为参数传递给拷贝构造函数来实现的。
特性
- 拷贝构造函数是构造函数的一个重载形式
- 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用
- 若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序拷贝,这种拷贝叫做浅拷贝,或者值拷贝
4.赋值构造函数
定义
赋值构造函数是一种特殊的构造函数,用于在创建一个新对象时将已有对象的值赋给新对象。与拷贝构造函数不同,赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。
class MyClass {
public:
// 构造函数
MyClass();
// 带参数的构造函数
MyClass(int data);
// 赋值构造函数
MyClass(const MyClass& other);
// 成员函数
void doSomething();
private:
int _data;
// ...
};
// 构造函数的定义
MyClass::MyClass() {
// 构造函数的实现
}
// 带参数的构造函数的定义
MyClass::MyClass(int data): _data(data) {
// 带参数的构造函数的实现
}
// 赋值构造函数的定义
MyClass::MyClass(const MyClass& other) {
_data = other._data;
}
// 成员函数的定义
void MyClass::doSomething() {
// 成员函数的实现
}
特性
- 赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。
- 赋值构造函数的参数是一个同类对象的常引用,用于指定要赋值的对象。
- 赋值构造函数不返回任何值,但是通常会返回一个指向当前对象的引用,以便支持链式赋值操作。
- 赋值构造函数应该实现为自我赋值安全的。这意味着在赋值构造函数的实现中应该始终检查要赋值的对象是否与当前对象相同,以避免发生自我赋值的情况。
- 如果您没有定义赋值构造函数,编译器会自动生成一个默认赋值构造函数。但是,如果您的类中有指针或其他资源,可能需要自定义赋值构造函数来确保复制对象的行为正确。
- 赋值构造函数通常用于对象的初始化操作,以确保新对象具有与原对象相同的状态和数据。通常,可以将拷贝构造函数和赋值构造函数合并为一个函数来避免代码的重复。
5.重载取地址运算符
定义
默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。
class MyClass {
public:
// 成员函数形式的重载取地址运算符
T* operator&();
private:
T _data;
// ...
};
// 成员函数形式的重载取地址运算符的定义
T* MyClass::operator&() {
return &_data; // 返回指向对象内部数据成员的指针
}
特性
- 重载取地址运算符改变了一个对象的地址返回方式。默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。
- 重载取地址运算符是一个成员函数,它必须被定义为类的公有成员函数。
- 重载取地址运算符必须返回一个指针类型,通常是对象内部数据成员的指针类型。
- 重载取地址运算符通常应该只用于获取对象内部数据成员的指针,而不应该用于修改对象的状态。
- 重载取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。
6.重载const取地址运算符
定义
重载 const 取地址运算符(&
)是一种特殊的运算符重载,用于改变一个常量对象的地址返回方式。默认情况下,const
取地址运算符返回常量对象的地址,但是通过重载 const 取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。
class MyClass {
public:
const MyClass* operator&() const {
return this;
}
};
int main() {
const MyClass obj;
const MyClass* ptr = &obj; // 调用重载的operator&
return 0;
}
特性
- 重载
const
取地址运算符改变了一个常量对象的地址返回方式。默认情况下,const
取地址运算符返回常量对象的地址,但是通过重载const
取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。 - 重载
const
取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为const
,以表示它不会修改对象的状态。 - 重载
const
取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。 - 重载
const
取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。
行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。 - 重载
const
取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为const
,以表示它不会修改对象的状态。 - 重载
const
取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。 - 重载
const
取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。 - 重载
const
取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载const
取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。