- 析构函数
- 复制构造函数
- =操作符(copy assignment operator)
这三个特殊的成员函数如果程序员没有实现,编译器将提供默认的实现方式。
析构函数:
形如~foo_t(),函数名和构造函数相同,前面加~,如果对象是*变量创建,析构函数将在脱离作用域时调用。如果对象是通过new操作符创建的,则通过delete操作符调用析构函数。
复制构造函数:
形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用:
- 当对象按值返回时候(returned by value)
- 调用按值传参的函数(passed by value)
- 通过thrown抛出或caught捕获的对象
- 对象处于()包围的初始化列表中
=操作符:
重载=操作符,如foo_t& operator=(const foo_t& foo),对已有对象的赋值操作将调用该函数(未初始化的对象成员将调用复制构造函数)。
以下为代码实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <cstring>
#include <iostream>
class foo_t {
friend std::ostream &operator<<(std::ostream &os, foo_t const &foo) {
os << foo.data;
return os;
}
public :
foo_t( void ) : data( new char [14]) { std:: strcpy (data, "Hello, World!" ); }
~foo_t( void ) { delete [] data; }
foo_t( const foo_t& other);
foo_t &operator=( const foo_t& other);
private :
char *data;
};
foo_t::foo_t( const foo_t& other) {
std::cout << "call copy constructor!!!" << std::endl;
this ->data = new char [ strlen (other.data) + 1];
strcpy ( this ->data, other.data);
}
foo_t& foo_t::operator=( const foo_t& other) {
std::cout << "call the copy assignment operator!!!" << std::endl;
if ( this == &other)
return * this ;
this ->data = new char [ strlen (other.data) + 1];
strcpy ( this ->data, other.data);
return * this ;
}
int main() {
foo_t foo;
std::cout << foo << '\n' ;
foo_t t(foo);
// foo_t t2 = t;
foo_t t3;
t3 = t;
return 0;
}
|
为了方便测试,可以分别在析构函数、拷贝构造、=重载处设置断点,观察程序执行流程。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!
原文链接:http://www.cnblogs.com/docliff/p/6371752.html