C++学习笔记之类的构造函数

1. 当类只有公有数据成员时,不需要构造函数,可以直接赋值,这是从从 C 语言继承来的机制支持显式初始化表。

class base
{
private:
	int print(void);
public:
	int val;
	char *ptr;	
};
base a = {12,"test base"};
显示初始化缺点:
1. 它只能被应用在所有数据成员都是公有的类的对象上
2. 要求程序员的显式干涉,增加了意外的可能性
显示初始化优点:
1. 显式初始化可以在装载时刻完成,从而节省了构造函数的启动开销(即使它被定义为 inline),尤其是对全局对象。

2. 类的构造函数
语法:1. 构造函数不能指定返回类型,甚至void类型也不可以;
         2. 类的构造函数数目没有限制,只要每个构造函数的参数列表是唯一的即可。
        3. 构造函数不能用 const 或 volatile 关键字来声明,但是const或volatile可以调用构造函数和析构函数,关键字的作用域从构造完成时刻到析构开始时刻。

使用:只有当没有构造函数或声明了缺省构造函数时,我们才能不指定实参集来定义类对象。一旦一个类声明了一个或者多个构造函数,类对象就不能被定义为不调用任何构造函数的实例。在实践中,如果定义了其他构造函数,则也有必要提供一个缺省构造函数。有些类要求有缺省构造函数,或者没有构造函数。


2.1 缺省构造函数:
缺省构造函数是指不需要用户指定实参就能够被调用的构造函数。这并不意味着它不能接受实参,只意味着构造函数的每个参数都有一个缺省值与之关联。

base::base():val(12),ptr("test base")
{
}

base::base(int num=12):ptr("test1 base")
{
	val = num;
}

base::base(int num=12, char *str="test2 base")
{
	val = num;
	ptr = str;
}
	base newbase;
	base newbase = base();	

如果类含有类数据成员或继承来的比较复杂的类,编译器可能会生成一个缺省构造函数。但是它不会为内置或复合型的数据成员,如指针或数组,提供初始值。


2.2 限制对象创建
构造函数的可访问性由其声明所在的访问区来决定,我们可以通过把相关的构造函数放到非公有访问区内,从而限制或显式禁止某些形式的对象创建动作。主要作用:
1. 防止用一个类的对象向该类另一个对象作拷贝

2. 指出只有当一个类在继承层次中被用作基类,而不能直接被应用程序操纵时,构造函数才能被调用


2.3 拷贝构造函数(按成员初始化)
用一个类对象初始化该类的另一个对象被称为缺省按成员初始化。在概念上,一个类对象向该类的另一个对象作拷贝是通过依次拷贝每个非静态数据成员来实现的。当按成员初始化不能满足程序设计要求时,类的设计者也可以通过提供特殊的拷贝构造函数来改变缺省的行为。
语法:拷贝构造函数有一个指向类对象的引用作为形式参数(传统上被声明为const)

base::base(const base &cp)
{
	val = cp.val;
	ptr = cp.ptr;
	cout<<"copy constructor"<<endl;
}		
	base newbase = oldbase;
	base newbase(oldbase);

禁止访问构造函数的方法:

1. 把拷贝函数声明为私有的,这可以阻止拷贝发生在程序的任何地方(除类的成员函数和友元函数外)

2. 只声明不定义拷贝函数,阻止类的成员函数和友元函数的访问

拷贝构造函数的执行过程:

当拷贝的成员是内置类型或复合数据类型时直接拷贝,当成员是类对象时,检查类对象是否定义了拷贝构造函数,如果没有使用缺省拷贝构造函数,如果有则调用定义的拷贝构造函数,这个过程是递归的。在定义类的拷贝构造函数时,对于成员是类对象的,不能直接赋值,应该使用成员初始化列表。

class base
{
public:
	base();
	base(const base &);
	int val;
	string ptr;	
};

base::base(const base &cp):val(cp.ptr)
{
	val = cp.val
}

2.4 按成员赋值

    缺省的按成员赋值所处理的是,用一个类对象向该类的另一个对象赋值。其机制和按成员初始化是一样的,它是通过一个隐式的操作符来完成。如果一个对象使用缺省的按成员初始化不合适,那么使用按成员赋值也是不合适的。可以通过重载赋值操作符来改变缺省的按成员赋值。拷贝操作符重载的一般格式如下:

className& className::operator=( const className &rhs )
{
	// 保证不会自我拷贝
	if ( this != &rhs )
	{
		// 类拷贝语义在这里
	}
	// 返回被赋值的对象
	return *this;
}













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值