C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数
1、构造函数
(1)每个类都要定义它自己的构造函数和析构函数,是类的成员函数。
特点:名称与类名相同;没有返回值;一定是共有函数,可以直接访问类内所有成员函数;可以带默认形参,可以重载;
class clock
{
public:
// 无参构造函数
clock()
{
cout << "无参构造函数" << endl;
}
// 有参构造函数
clock(int h, int m , int s)
{
hour = h;
minute = m;
second = s;
cout << "有参构造函数" << endl;
}
//// 有默认参数值的有参构造函数
//clock(int h=8, int m=20, int s=20)
//{
// hour = h;
// minute = m;
// second = s;
// cout << "有默认参数值的有参构造函数" << endl;
//}
//拷贝构造函数完成,用一个对象初始化另一个对象
clock(const clock &t) // const 加不加都可以
{
cout << "复制构造函数" << endl;
} private:
int hour; int minute; int second;
}; void main()
{
clock myclock; // 调用无参构造函数,不能加括号
//clock myclock_1();// 调用有参构造函数,此时会出错,因为没有传参数
clock myclock_2(,,);// 有参构造函数,必须要写上参数 clock myclock_3(myclock_2);// 调用复制构造函数
clock myclock_3 = myclock_2;// 同样调用copy构造函数
system("pause");
}
(2)注意:
(1)类中没有定义任何构造函数时,才使用默认构造函数,只要定义了,就不会存在默认构造函数;
(2)不能同时出现,无参构造函数和带有全部默认参数值的构造函数;二者只能出现一个;
(3)复制构造函数,使用一个已存在的对象,初始化一个新的同类对象。如果未定义,系统将会自动生成;但是,如果申请动态空间(堆空间),则必须定义。
(4)构造函数中调用构造函数,是危险的行为。(会因为调用匿名对象,而直接析构掉)
2、对象数组
解释为什么需要构造函数,在定义对象数组时,自动初始化。
class student
{
public:
student(int, char*);
student();
~student();
void set(int i, char* c);
void printstu()
{
cout << "id: " << id << " name: " << name << setw() << endl;
}
private:
int id;
string name;
};
student::student()
{
cout << "默认无参构造函数" << endl;
}
student::student(int i, char* c)
{
id = i;
name = c;
cout << "有参构造函数" << endl;
}
student::~student()
{
cout << "析构函数" << endl;
} void student::set(int i, char* c)
{
id = i;
name = c;
} void main()
{
// 对象数组
student stu[] = {
student(,"li"),
student(,"wang")
};
stu[].set(, "zhao");
system("pause");
}
定义两个构造函数,此时定义对象数组时,可以不用初始化。
构造函数在定义对象时调用,析构函数在程序结束时调用,而且,析构顺序与构造顺序相反。
3、复制构造函数
复制构造函数,也是构造函数。只在初始化时调用,如果定义对象后赋值,比如,t1=t2,则只是运算符重载,没有调用构造函数。
student::student(student &s)
{
cout << "复制构造函数" << endl;
id = s.id;
// 使用字符指针定义的变量,需要定义复制构造函数,申请空间。
// 也需要定义 构造函数 和 析构函数
name = new char[strlen(s.name) + ];
if (name != )
strcpy_s(name, strlen(s.name) + , s.name);
}
调用:有四种方法。
// 对象数组
student stu[] = {
student(,"li"),
student(,"wang")
};
stu[].set(, "zhao");
1、 student stucopy(stu[]);
2、 student stucopy_1 = stu[];
还可以用函数调用:
void f(student p)
{
// 用于类对象的复制。
cout << "此处要调用复制构造函数" << endl;
} student stu;
stu.set(, "zhao");
f(stu);
还有一种情况:就是函数返回值是一个类对象,返回的是一个新的匿名对象,此处要调用复制构造函数。
student g()
{
student stu1(, "abc");
return stu1;
// 用于类对象的复制。返回的匿名对象的复制,因为 stu1 是局部变量,函数结束时要销毁。
cout << "此处要调用复制构造函数" << endl;
}
student s = g();//此处只是换了名字,没有调用复制构造函数了
如果匿名对象,初始化另一个同类型的对象,则匿名对象转成有名对象,不调用复制构造函数;
如果匿名对象赋值给另一个对象,则匿名对象马上被析构;
4、匿名对象的声明周期
int run3()
{
cout << "run3 start...." << endl;
B(, ); //执行此步,匿名对象调用构造函数后,马上调用析构函数(因为没有东西接) //此处,匿名函数被 b 接到了,就只调用了构造函数,匿名对象转成有名对象
// 该有名对象是局部变量,在函数结束返回时析构(也就是 return 处)。
B b = B(, ); cout << "run3 end...." << endl;
return ;
}
C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数的更多相关文章
- 【emWin】例程二十六:窗口对象——Listbox
简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...
- 第一百二十六节,JavaScript,XPath操作xml节点
第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- 使用Typescript重构axios(二十六)——添加HTTP授权auth属性
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- django 使用form验证用户名和密码
form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- codin ...
- PHP程序执行时间过长,超时了怎么办
解决办法:修改php.ini文件,把最大的执行时间改为0,0表示不限制时间. max_execution_time = 0
- mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数
mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...
- openURL的使用
1)私有方法跳转 /** 私有方法,不建议使用 利用ASCII值进行拼装组合方法.这样可绕过审核. 上面是进入蓝牙界面的方法.也可以有其他的页面可以跳转.设置页面是@"@"Pref ...
- SQL Server自定义字符串分割函数——Split
我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...
- sgu 100 A+B 解题报告及测试数据
100.A+B time limit per test: 0.25 sec. memory limit per test: 65536 KB 题解:上手题,不解释. 直接上代码: #include & ...
- Python实例1—格式化输出
老男孩教学学习笔记: 实例1:格式化输出 # Author:Alex Li name = input("name:") # raw_input 2.x input 3.x # in ...
- mysql服务解压版的安装(5.7)
推荐博客: https://www.cnblogs.com/LxyXY/p/7708016.html
- linux配置Nginx启动,停止
Nginx 启动.重启.停止脚本 第一步 先运行命令关闭nginx sudo kill `cat /usr/local/nginx/logs/nginx.pid` 第二步 vi /etc/in ...
- MVC中使用分部视图参数,改变分部视图连接样式
MVC中使用分部视图参数,改变分部视图连接样式! Controller代码 [ChildActionOnly] public ActionResult Navigator(int tag) { ret ...