**************************************************构造函数************************************************
构造函数:没有返回值,就是函数名与类名相同而已。不可以显示调用,就是不可以调用,
他不是普通函数(就是我们没学类之前的函数)。可以在函数体或初始化列表中定义全部的成员变量,
也可以不全定义。可以重载,参数不限,通常构造函数是公有属性,如果用户没有定义构造函数,
系统会自动生成一个默认构造函数即缺省构造函数(无参数无函数体)。
它是在创建对象时自动调用。主要功能是为成员变量赋值。
********在构造函数中若第N个参数有值,则其后的所有参数都有值。************它分为三类:*****************默认构造函数   自定义无参构造函数   带参数的构造函数(有初始化列表,有默认值)调用哪一个,看对象后面有几个参数或者有无括号。    ****************************************默认构造函数*******************************************
默认构造函数:函数体为空以及无参数。Peoson(){}只是创建对象,赋值是随机的。不能给数据成员赋初值。
系统提供的默认的缺省构造函数是公有属性,只要类中有任何构造函数的声明或定义,不会提供默认构造函数,
不管自己定义的是什么访问权限,需要无参的构造函数(缺省构造函数)那就自己在定义一个。
一般默认构造函数是系统给的,在无构造函数时,就像下面的例题
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:void diap();void dun();
};
void peson::diap()
{cout<<m_name<<"的明智"<<m_age<<endl;
}
int main()
{peson a;//调用无参函数,因为没有定义无参构造函数,所以只能调用系统默认了。
/*peson a(1);错误,因为没有定义只有一个参数的构造函数,只有定义构造函数,才可以有对应的对象。
可以构造函数没有对象,但是只要定义个有参的构造函数那就不能使用peoson a;因为系统提供默认的构造函数,
前提是没有构造函数而言。*/
a.diap();
}
*************  *************************************
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int x,int y):m_name(x),m_age(y){cout<<m_name<<m_age;}
};int main()
{peson a;//错误,因为没有无参的构造函数。要调用,那就再定义一个无参的构造函数。
a.diap();
}
********************************************自定义无参构造函数*********************************************
自定义无参构造函数:就是没有参数只有函数体,这个不是缺省构造函数,缺省构造函数就是系统默认的构造函数
一般自定义无参构造函数是在函数体内把数据成员初始化为固定值。
#include<iostream>
using namespace std;
class Peoson
{int name;float age;public:Peoson(){name=3;age=4;}void dip();
};
void Peoson::dip()
{cout<<name<<"的年龄"<<age<<endl;
}int main()
{ Peoson a;//Peoson a()定义一个a()函数,并不是变量a调用无参构造函数。而Peoson a;才是调用无参函数a.dip();  return 0;
}3的年龄是12
**************************************带参数的构造函数**********************************
定义的对象必须和构造函数有一致的参数表。也可以定义多个具有不同参数的构造函数,实现不同数据成员的初始化,
那就是重载。*************************带参数的构造函数三种赋值的方法*********************函数体赋值      初始化列表           默认参数******1                      ***********函数体赋值***************#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:void diap();peson(int m,int n);*******对于不同函数参数可以一样。void setnage(int m,int n );*********};peson::peson(int m,int n) {m_name=m;m_age=n;}
void peson::setnage(int m,int n )
{m_name=m;m_age=n;
}
void peson::diap()
{cout<<m_name<<"的明智"<<m_age<<endl;
}
int main()
{peson a(1,2);//调用构造函数
a.diap();
a.setnage(3,4) ;
a.diap();
}
******2                       ************初始化列表******************
介绍了有参函数和无参函数利用初始化列表的初始化
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:
peson(int m,int n);********格式
peson();************};//对于类必须要有;号peson::peson(): m_name(3),m_age(4)***********对于成员变量可以不全部初始化,就是只初始化m_name也可以。{cout<<m_name<<"的年龄"<<m_age<<endl;}peson::peson(int m,int n):m_name(m),m_age(n)**************格式{cout<<m_name<<"的年龄"<<m_age<<endl;}
int main()
{peson a(1,2),a1;
}//1的年龄是2//3的年龄是4#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int m,int n);peson();};
int k=3,j=4;peson::peson(): m_name(k),m_age(j)***对于无参构造函数可以带变量,但是变量得提前定义,可以不赋值,这时为任意值{cout<<m_name<<"的年龄"<<m_age<<endl;}peson::peson(int m,int n):m_name(m),m_age(n){cout<<m_name<<"的年龄"<<m_age<<endl;}
int main()
{peson a(1,2),a1;}
//1的年龄是2//3的年龄是4

其实下面这俩张图片是等价的。


但是下面的图片和上面三张图片不等价。下面是错误的,不可以m_name(3);m_age(4);这样赋值
是错误的。

*******3                        **********************带默认参数值的构造函数***********************
引用形式:可以对象无参数,可以有不超过带默认参数值的构造函数的参数,可以等于。参数≠带默认参数值的构造函数的参数
时,就默认使用带默认参数值的构造函数的参数中的其他参数。
***********带默认参数值的构造函数会与无参构造函数及同参数构造函数产生二义性*******************
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int m,int n);peson();peson(int x,int y);};peson::peson():m_name(3),m_age(4){cout<<m_name<<"的年龄"<<m_age<<endl;}peson::peson(int x=12,int y=13){m_name=x;m_age=y;cout<<m_name<<"的年龄"<<m_age<<endl;}peson::peson(int m,int n):m_name(m),m_age(n){cout<<m_name<<"的年龄"<<m_age<<endl;}
int main()
{peson a(1,2);
peson a1,a2(1);
}     程序错误,  D:\Desktop\未命名1.cpp [Error] with 'peson::peson(int, int)'如果屏蔽 peson(int m,int n);及peson a(1,2);   D:\Desktop\未命名1.cpp [Error] call of overloaded 'peson()' is ambiguous
事实证明,对于带默认值的构造函数,使用他时候,不可以有无参的构造函数及和他参数一致的构造函数,
这三个函数就不能同时定义在class中,因为系统无法识别调用哪个函数#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int x,int y);};peson::peson(int x=12,int y=13){m_name=x;m_age=y;cout<<m_name<<"的年龄"<<m_age<<endl;}int main()
{peson a(1,2);
peson a1,a2(1);
//peson a2(,7);不可以这样写要一一写
}   1的年龄是212的年龄是131的年龄是13
就可以了,去掉俩个构造函数,只有一个构造函数那就是带默认值的构造函数。
或者去掉带默认值的构造函数。俩种方法。
*********************
建立对象用peson a1;而不用peson a2();因为后者为声明一个普通函数。
对于每一个对象来说,建立对象时只执行其中一个构造函数,而不是都执行。
构造函数不能被调用,只是为了初始化。
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int x){m_name=x;cout<<"你好"<<m_name<<endl;}peson(int x=12,int y=13);};peson::peson(int x,int y){m_name=x;m_age=y;cout<<m_name<<"的年龄"<<m_age<<endl;}int main()
{peson a(1,2);
peson a1;
peson a2(3);
}   /*peson a2(3);有错误,因为 peson(int x=12,int y=13);与 peson(int x)会有冲突,
因为带有默认值的构造函数,它的对象可以从0到他的参数极限,所以系统会产生二义性,不知道调用哪一个。*/
***********对于下面的这一个是带有默认值的构造函数,他的参数表少于自定的构造函数,所以可以。
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int x,int y){m_name=x;m_age=y;cout<<m_age<<"你好"<<m_name<<endl;}peson(int x=12);};peson::peson(int x){m_name=x;
cout<<m_name<<"的年龄"<<endl;}int main()
{peson a(1,2);
peson a1;
peson a2(3);
}
2你好1
12的年龄
3的年龄*****************************认识一下带默认值的构造函数**********************************#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int x,int y);*************};peson::peson(int x=12,int y=13)************{m_name=x;m_age=y;cout<<m_name<<"的年龄"<<m_age<<endl;}int main()
{peson a(1,2);
peson a1,a2(3);
}   1的年龄是212的年龄是131的年龄是13***********************************************
#include<iostream>
using namespace std;
class peson
{int m_name;
int m_age;
public:peson(int =12,int =13);************peson(int x=12,int y=13);也可以};peson::peson(int x,int y)*************{m_name=x;m_age=y;cout<<m_name<<"的年龄"<<m_age<<endl;}int main()
{peson a(1,2);
peson a1,a2(3);
}
1的年龄是212的年龄是131的年龄是13
*******************************************重载构造函数**************************************

来看一下:构造函数的小秘密详解相关推荐

  1. java构造方法重载_Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定 ...

  2. php中类的构造函数和析构函数,php面向对象-构造函数和析构函数详解

    php面向对象中构造函数(__construnct)和析构函数详解(__destruct) //在实际运用中构造函数的作用可以用来给属相初始化值,或初始化操作,话不啰嗦,例子更能形象说明: class ...

  3. C++ 构造函数和析构函数 详解

    目录 概述 构造函数的分类 1. 无参(默认)构造函数 2. 有参构造函数 3. 委托构造函数 4. 复制(拷贝)构造函数 5. 移动构造函数 构造函数调用规则 析构函数 概述 C++中用构造函数和析 ...

  4. 类的构造函数和析构函数详解

    一:类的构造函数 1.构造函数定义 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可 ...

  5. JS构造函数之new详解

    文章目录 构造函数的基本使用 手写实现 构造函数的基本使用 function Person(name, age) {this.name = name;this.age = age// return { ...

  6. java反射 调用构造函数_Java反射详解

    AccessibleObject 类是 Field.Method 和 Constructor 对象的基类.它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力.对于公共成员.默 ...

  7. 详解iPhone开发之Objective-C和 C 混编

    详解iPhone开发之Objective-C和 C 混编 2011-07-29 15:47 佚名 互联网 字号:T | T 本文介绍的是详解iPhone开发之Objective-C和C混编,介绍了ip ...

  8. sqlmap工具使用用法详解

    2019独角兽企业重金招聘Python工程师标准>>> sqlmap工具使用用法详解 QLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的 ...

  9. mysql increment_mysql中auto_increment用法详解

    在mysql中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,也就是会自动自增一个ID了,如现在是1下次会自动是2了,就这么简单,下面来看mysql中auto_increme ...

最新文章

  1. 继中美之后,欧盟会成为下一个 AI 超级体吗?
  2. 字节通常用英文单词bit来表示_字节跳动为什么有字节2个字,因为程序的真谛:字节...
  3. html制作背景音乐,HTML插入背景音乐方法【全】
  4. gslang——原生golang/RPC描述语言简介
  5. 联机日志损坏时的恢复(非正常关闭数据库)
  6. 推荐 10 个好用的 Vue3 的开源项目,开发效率又能提升了!
  7. MySQL单行函数分类
  8. copy-maven-plugin - where is it configured - Maven原理探究
  9. svn merge 回滚
  10. wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...
  11. csharp:Nhibernate Procedure with CreateSQLQuery and GetNamedQuery
  12. Android OOM案例分析
  13. 第一章 计算机网络 4 性能指标 [计算机网络笔记]
  14. Linux搭建虚拟专用,Ubuntu的发行版如何搭建虚拟专用网
  15. python我想对你说_python学习22天----模块、包
  16. 西部开源学习笔记BOOK2《vsftp服务》
  17. INSTALL_FAILED_TEST_ONLY的解决办法
  18. 宏文件下载_Catia常用宏文件分享(压箱底)
  19. csgo准星设置代码_csgo准星参数代码
  20. 计算机拼音字体大小设置,怎样调整字体大小

热门文章

  1. 如何加快C++代码的编译速度
  2. SSM-水果商城-pom.xml-学习-3
  3. php提前输出响应及注意问题
  4. 《Xcode实战开发》——1.1节下载
  5. 【Computer Organization笔记11】多周期CPU
  6. GCD 信号量控制并发 (dispatch_semaphore)
  7. 批量图片处理,打包成zip
  8. CCNP精粹系列之十七--路由映射实战,博主推荐
  9. css网页favicon_自用代码css获取任意网址的/favicon.ico的方法教程
  10. CentOS7.6安装WirёGuαrd(一)