构造函数浅析

 构造函数浅析
 
规则一: 声明规则Ⅰ:
1.       即没有声明默认( 缺省) 构造函数, 也没有声明其他构造函数, 合法.
2.       如果只声明了默认( 缺省) 构造函数, 合法.
3.       如果声明了默认( 缺省) 构造函数, 但不是公有, 错误.
4.       即声明了默认( 缺省) 构造函数, 也同时声明了带默认参数的构造函数. 错误. 因为存在暧昧构造函数调用.
不带任何参数的构造函数称为 默认 ( 缺省) 构造函数.如果违背了规则中的第三条,将会引起编译错误.必须声明为public型.(思考:为什么?).如果声明了 带默认参数的构造函数.即声明X(int=0 );函数.那么就可以这样调用X a;如果同时也声明了X();将会引起编译错误.因为编译器无法知道链接到哪个函数,是X();还是X(int=0 );函数呢?
同时也要注意下列两种情况:
A.     如果没有声明默认构造函数, 但声明了一个或者多个要求实参的构造函数.
那么以X a;创建对象a时,将引起编译错误.因为实参太少.只能以这种情况创建X a(参数列表);
B.      如果没有定义默认构造函数, 但是定义了一个或者多个要求实参的构造函数, 且带默认参数.
则可以解决A中的错误.
 
规则二: 声明规则Ⅱ:
1.   构造函数不能指定返回值类型和返回值.
2.  不能被声明为虚函数
3.  可以重载构造函数.
与之对应的析构函数可以被声明为虚函数,但不能重载析构函数.一个类只能有一个析构函数,且不能向构造函数那样给析够函数传递参数
 
规则三: 初始化规则:
1.       类的数据成员不能在定义类的时候初始化.
2.       必须在类的构造函数中初始化、或者在建立类的对象后在设置它们的值.
C++程序与Java程序不同,java程序可以在声明类时,给 数据成员赋初值,但在C++中是不允许的.而必须在类的构造函数中初始化.即按 成员初始化表来初始化 数据成员 .如X::X():value(3){};对于任何类型的const和引用数据成员,必须在成员初始化表中被初始化,否则,就会引起编译时刻错误.而对于其他内部类型可以在构造函数中赋初值.
 
规则四: 调用顺序规则:
1.       在创建一个对象时自动地调用一个构造函数.
2.       在创建一个派生类对象时, 首先执行基类的构造函数, 然后执行派生类成员对象的构造函数, 最后才执行派生类的构造函数.( 析构函数的调用规则与构造函数相反).
3.       如果没有显示定义构造函数, 那么编译器就会为该类添加一个默认构造函数, 但该默认构造函数并不做任何初始化工作.
 
 
规则五: 定义对象规则:
只有当没有声明构造函数或者声明了缺省构造函数时, 或者声明了带默认参数的构造函数时, 我们才能不指定实参来定义类对象.
X a(); // 编译错误    被编译器解释为定义了一个没有参数,返回一个X类型对象的函数.用缺省构造函数初始化类对象的正确声明是去掉括号.而不是调用缺省构造函数.
 
规则六: 拷贝构造函数:
1.       当通过数值传递, 通过数值返回, 或者明确地拷贝一个对象时就应该调用拷贝构造函数.
2.       拷贝构造函数特征标记为:X::X(const X&).
3.       拷贝构造函数的参数虽然不一定是const, 但它必须是引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值