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++(二十六) — 构造函数、析构函数、对象数组、复制构造函数的更多相关文章

  1. 【emWin】例程二十六:窗口对象——Listbox

    简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...

  2. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...

  3. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  4. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  5. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...

  6. JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

    JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...

  7. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  8. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  9. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  10. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. Python数据库连接池实例——PooledDB

    不用连接池的MySQL连接方法 import MySQLdb conn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='m ...

  2. Java CodeFormatter

    设置Formatter模板的入口: Window->Preference->Java->Code Style->Code Formatter <?xml version= ...

  3. Java网络通信基础编程

    一.同步阻塞方式(BIO) 方式一: 服务器端(Server): package com.ietree.basicskill.socket.mode1; import java.io.IOExcept ...

  4. HDU 4746 Mophues(莫比乌斯反演)

    题意:求\(1\leq i \leq N,1\leq j \leq M,gcd(i,j)\)的质因子个于等于p的对数. 分析:加上了对质因子个数的限制. 设\(f(d):[gcd(i,j)=d]\) ...

  5. 自从教学弟学会了Python,他每天都爬一些好不正经的图片!

    学弟他作为一个宅男,闲着没事就喜欢用我教他的Python来爬一些 “资源” 套图欣赏,我每次都骂他你总是这样找个女朋友不好点,他不以为然,依旧如故.气的我只好把他写的东西发出来让更多的人来谴责他! 我 ...

  6. $聊一聊"驼峰"和"下划线"——Python re.sub函数详细用法实例讲解

    日常写代码时候会遇到一些字符串替换的操作,比如把一大堆"驼峰"形式的字符串批量转换成下划线形式."驼峰"形式的变量命名风格在Java中很常见,而下划线形式的变量 ...

  7. 前端JS复制特定区域的文本(兼容safari)

    html5的webAPI接口可以很轻松的使用短短的几行代码就实现点击按钮复制区域文本的功能,不需要依赖flash. 代码如下: /* 创建range对象 */ const range = docume ...

  8. 制作RPM包

    RPM包制作过程 1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制作的对象 ...

  9. php项目代码 编码格式不对会大范围报错

    php项目代码 编码格式不对会大范围报错

  10. 【前端】Vue.js实现简单价格计算器

    价格计算器 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>价格计算器</title> ...