C++学习笔记之类的构造函数
来源:互联网 发布:vm虚拟机没网络 编辑:程序博客网 时间:2024/06/04 17:55
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();
如果类含有类数据成员或继承来的比较复杂的类,编译器可能会生成一个缺省构造函数。但是它不会为内置或复合型的数据成员,如指针或数组,提供初始值。
构造函数的可访问性由其声明所在的访问区来决定,我们可以通过把相关的构造函数放到非公有访问区内,从而限制或显式禁止某些形式的对象创建动作。主要作用:
1. 防止用一个类的对象向该类另一个对象作拷贝
2. 指出只有当一个类在继承层次中被用作基类,而不能直接被应用程序操纵时,构造函数才能被调用
用一个类对象初始化该类的另一个对象被称为缺省按成员初始化。在概念上,一个类对象向该类的另一个对象作拷贝是通过依次拷贝每个非静态数据成员来实现的。当按成员初始化不能满足程序设计要求时,类的设计者也可以通过提供特殊的拷贝构造函数来改变缺省的行为。
语法:拷贝构造函数有一个指向类对象的引用作为形式参数(传统上被声明为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;}
- C++学习笔记之类的构造函数
- 学习C++(1)之类的拷贝构造
- C++学习笔记十五之类的构造函数和析构函数
- c++之类的构造函数
- Javascript学习笔记(二)Javascript核心之类,构造函数和原型
- Javascript学习笔记(二)Javascript核心之类,构造函数和原型
- c++基础之类的构造函数
- 学习笔记之类的数据成员指针和函数指针
- C#学习之类的构造方法
- C/C++学习笔记:String类的构造函数、析构函数和赋值函数
- c++primer之类(构造函数再探)
- C++学习之类提供的默认函数-构造、复造、析够、赋值、取址
- C++函数之类的构造函数析构函数
- C++函数之类的构造函数与析构函数
- C++学习之类中构造函数初始化操作
- 【C++】学习笔记四十七——类的构造函数和析构函数
- c++拷贝构造函数的学习笔记
- 黑马程序员--构造函数的学习笔记
- beans.xml配置文件中注入对象的集合
- VerticalGridView第一行获取焦点后,再次按向上键,上方的控件获取不到焦点解决方案
- Android NFC开发
- Github优秀web前端资源收集
- 获取屏幕高宽,在代码中设置控件大小的方法
- C++学习笔记之类的构造函数
- 云计算期末报告无图 kmeans和最短路径算法hadoop实现详解
- iOS常用框架总结
- 集合框架_ArrayList集合嵌套HashMap集合的案例
- 【jzoj3853】【帮助Bsny】【状态压缩动态规划】
- Android使用adb命令修改密度
- 画画不好的人手残患者有救了!
- 【JS】从零开始编一个JS游戏(2)
- java虚拟机jvm