委托构造函数的高级用法
时间: 2023-05-25 17:05:56 浏览: 73
1. 委托构造函数可以用来避免代码重复,也就是说,可以通过在一个构造函数中调用另一个构造函数来避免代码的重复。这在有多个构造函数的情况下可以非常有用。
示例代码:
```
class A
{
public:
A() : A(0)
{
std::cout << "A()\n";
}
A(int n)
{
std::cout << "A(int)\n";
}
A(const A& a) : A(a.n)
{
std::cout << "A(const A&)\n";
}
private:
int n;
};
```
2. 有时需要在构造函数中对成员变量进行一些特殊操作。这时,可以定义一个私有的构造函数来进行这些操作,并在其它构造函数中调用它。
示例代码:
```
class A
{
public:
A() : A(0)
{
std::cout << "A()\n";
}
A(int n) : A(n, 0)
{
std::cout << "A(int)\n";
}
A(int n, int m)
{
std::cout << "A(int, int)\n";
this->n = n;
this->m = m;
}
private:
int n;
int m;
};
```
3. 委托构造函数还可以用来实现默认参数的构造函数。
示例代码:
```
class A
{
public:
A(int n = 0, int m = 0) : n(n), m(m)
{
std::cout << "A(int, int)\n";
}
private:
int n;
int m;
};
```
4. 可以为一个类定义多个委托构造函数,以便根据需要进行不同的初始化操作。
示例代码:
```
class A
{
public:
A() : A(0, 0)
{
std::cout << "A()\n";
}
A(int n) : A(n, 0)
{
std::cout << "A(int)\n";
}
A(int n, int m) : n(n), m(m)
{
std::cout << "A(int, int)\n";
}
private:
int n;
int m;
};
```
5. 将一个对象的构造函数委托给另一个对象的构造函数,可以用来实现更复杂的初始化过程。
示例代码:
```
class A
{
public:
A() : A(nullptr)
{
std::cout << "A()\n";
}
A(void* ptr)
{
std::cout << "A(void*)\n";
if (ptr == nullptr)
{
std::cout << "ERROR: ptr cannot be null.\n";
exit(-1);
}
this->ptr = ptr;
}
private:
void* ptr;
};
class B
{
public:
B() : A(this), n(0)
{
std::cout << "B()\n";
}
B(int n) : A(this), n(n)
{
std::cout << "B(int)\n";
}
private:
A a;
int n;
};
```
在这个示例代码中,类A的构造函数需要一个指针作为参数,而这个指针必须在初始化前存在。为了确保指针存在,我们定义了一个类B并将对象b的地址传递给了对象a的构造函数。这样,我们就可以确保在对象a的构造函数执行前,对象b已经存在了。同时,在类B的构造函数中,我们还可以对其他成员变量进行初始化。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)