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. springboot使用tomcat apr模式

    因需项目对并发要求比较高.提高Tomcat效率.使用tomcat apr模式.今天在这记录下使用过程.apr全称为apache portable runtime.这里套用下wiki对apr的解释. T ...

  2. 主成分分析PCA学习一条龙

    转自:https://yoyoyohamapi.gitbooks.io/mit-ml/content/%E7%89%B9%E5%BE%81%E9%99%8D%E7%BB%B4/articles/PCA ...

  3. (转)Spring整合Jpa

    Spring-data-jpa 学习笔记(一) 作者:zeng1994  出处:http://www.cnblogs.com/zeng1994/ Spring家族越来越强大,作为一名javaWeb开发 ...

  4. The Jordan 3lab5 is the perfect sneaker for you

    The Jordan 5 3Lab5 Metallic Silver returns inside a mind-turning new iteration for that Spring/Summe ...

  5. Gentoo64无法启动eth0的问题

    Gentoo64在net文件中配置好eth0的静态IP 代码 1.2: /etc/conf.d/net文件的一个示例 # DHCP config_eth0=( "dhcp" ) # ...

  6. 【java】使用Builder模式,轻松应对动态繁杂的方法参数

    背景:在咱编写的图片处理模块里,针对加载这个方法,参数很多,如: /** * 加载图片,经过内存.磁盘.两层缓存如果还没找到,则走http访问网络资源 * @param url 地址 * @param ...

  7. cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing file.

    程序运行的时候输出这条信息cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing fi ...

  8. Win10应用《纸书科学计算器》更新啦!

    <纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...

  9. 什么是“QQ登录OAuth2.0”

    1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他 ...

  10. 2705: [SDOI2012]Longge的问题

    Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1898  Solved: 1191[Submit][Status][Discuss] Descripti ...