C++ 构造函数浅析
2014-07-16 13:37
148 查看
1、C++ 构造函数分类
C++中分为默认构造函数、拷贝构造函数、赋值函数、自定义构造函数。
举例如下:
当类中没有构造函数时,编译器会为此类生成默认构造函数并在生成对象时自动调用。
2、各种类型构造函数使用情景
自定义构造函数:
定义对象时、以new方式生成对象指针时
拷贝构造函数:
当函数参数为对象传参数时、当返回为对象时、用已有对象初始化对象时
赋值函数:
显示使用==对象赋值时
3、验证
执行结果如下:
值得注意的是g++ 默认采用RVO优化,导致当对象为返回值时应该调用的拷贝构造函数执行被优化省略了。
4、延深思考-何时需要自定义拷贝构造函数
Q:
对于拷贝构造函数,为了防止浅拷贝造成的两个对象指向同一内存,当删除其中一个对象后导致另一对象指向内容为空的时候,我们就需要定义自己的拷贝构造函数来进行深拷贝。
对于自定义结构当结构成员中没有需要动态分配的指针成员时,完全不需要自定义拷贝构造函数。
如:
struct USER_T
{
Int index;
String name;
SOCK sock;
};
执行newUser=oldUser; 时每个成员字段都会正确赋值即编译器默认会对每个字段执行浅拷贝。
C++中分为默认构造函数、拷贝构造函数、赋值函数、自定义构造函数。
举例如下:
当类中没有构造函数时,编译器会为此类生成默认构造函数并在生成对象时自动调用。
自定义构造函数: USER_T() { printf(" 普通构造函数\n"); } USER_T(intid,string name,int sockValue) :index(id),nodeName(name) { sock.fd= sockValue; printf(" 自定义构造函数\n"); } 赋值函数: USER_T&operator=(const USER_T& user) { printf("赋值构造函数\n"); index=user.index; nodeName=user.nodeName; sock=user.sock; } 拷贝构造函数: USER_T(const USER_T& user) { printf("拷贝构造函数\n"); index=user.index; nodeName=user.nodeName; sock=user.sock; }
2、各种类型构造函数使用情景
自定义构造函数:
定义对象时、以new方式生成对象指针时
拷贝构造函数:
当函数参数为对象传参数时、当返回为对象时、用已有对象初始化对象时
赋值函数:
显示使用==对象赋值时
3、验证
#include <stdlib.h> #include <stdio.h> #include <string> using namespace std; typedef struct SOCK { int fd; }SOCK_T; class USER_T { public: USER_T() { printf(" 普通构造函数\n"); } USER_T(intid,string name,int sockValue) :index(id),nodeName(name) { sock.fd= sockValue; printf(" 自定义构造函数\n"); } USER_T(const USER_T& user) { printf("拷贝构造函数\n"); index=user.index; nodeName=user.nodeName; sock=user.sock; } USER_T& operator=(const USER_T& user) { printf("赋值构造函数\n"); index=user.index; nodeName=user.nodeName; sock=user.sock; } void show() { printf("USER_T:index[%d] name[%s]fd[%d]\n",index,nodeName.c_str(),sock.fd); } private: int index; stringnodeName; SOCK_T sock; }; USER_T getUser(); void display(USER_T user) { user.show(); printf("Eixt display()\n"); } int main ( int argc, char *argv[] ) { USER_T user; printf("user address:%d\n",&user); user=getUser(); printf("****read to display()****\n"); display(user); printf("****test NRVO****\n"); USER_TuserNrvo=getUser(); printf("userNrvo address:%d\n",&userNrvo); printf("****test NRVO end****\n"); getchar(); returnEXIT_SUCCESS; } /*---------- end of function main ---------- */ USER_T getUser() { printf("Enter getuser()\n"); USER_T user1; printf("geruser:return user address[%d]\n",&user1); USER_T* pUser =new USER_T(1212,"KK",890); printf("new User finished\n"); user1=*pUser; delete pUser; .printf("Exit getuser()\n"); return user1; }
执行结果如下:
值得注意的是g++ 默认采用RVO优化,导致当对象为返回值时应该调用的拷贝构造函数执行被优化省略了。
4、延深思考-何时需要自定义拷贝构造函数
Q:
对于拷贝构造函数,为了防止浅拷贝造成的两个对象指向同一内存,当删除其中一个对象后导致另一对象指向内容为空的时候,我们就需要定义自己的拷贝构造函数来进行深拷贝。
对于自定义结构当结构成员中没有需要动态分配的指针成员时,完全不需要自定义拷贝构造函数。
如:
struct USER_T
{
Int index;
String name;
SOCK sock;
};
执行newUser=oldUser; 时每个成员字段都会正确赋值即编译器默认会对每个字段执行浅拷贝。
相关文章推荐
- C++的构造函数浅析
- C++构造函数浅析(1)
- C++ FAQ Lite[8]--引用(更新)
- 开发工具大比拚之Visual C++ vs. Delphi(三)
- 开发工具大比拚之Visual C++ vs. Delphi(二)
- 开发工具大比拚之Visual C++ vs. Delphi(一)
- Byte杂志C++调查报告
- 对今年内将出版的几本C++书的简评
- VC不是梦想,C++需要自由的心
- C++之父B. Stroustrup近期言论
- 用纯粹的C++编写COM组件
- 在Delphi与C++之间实现函数与对象共享
- C/C++的思索 C++之父访谈录 [上帝的玩笑吗?]
- 突破C++的虚拟指针--C++程序的缓冲区溢出攻击
- C++: BIG5到GB
- C++ FAQ Lite[13]--算符重载(新)
- C++ FAQ Lite[7]--类和对象(更新)
- C++ FAQ Lite[17]--异常和错误处理(更新)
- C++ FAQ Lite[9]--内联函数(更新)