前言:构造函数是C+中很重要的一个概念,这里对其知识进行一个简单的总结

一、构造函数的定义

1.类中的构造函数名与类名必须相同

2.构造函数没有函数的返回类值型说明符

[特别注意]:

a.构造函数的返回值类型不是void,而是没有

b.构造函数虽然没有返回值类型说明符,但构造函数是有返回值的,构造函数的返回值是其所创建的对象

  1. class Student{
  2. public:
  3. Student(){} //构造函数的函数名与类名必须相同
  4. //构造函数没有返回值类型说明符
  5. .....//其他操作
  6. }

3.在程序运行时,当新的对象被建立时,该对象所属的类的构造函数自动被调用,且在该对象生存期中只调用这一次

4.构造函数可以重载。在类中可以定义多个构造函数,它们由不同的参数列表区分,系统在自动调用时按一般函数重载的规则选一个执行

  1. class Student{
  2. public:
  3. Student(){}//构造函数1
  4. Student(string name);//构造函数2
  5. Student(string name,int age);//构造函数3
  6. Student(string name,int age,string gender);//构造函数4
  7. private:
  8. string Name;
  9. int Age;
  10. string Gender;
  11. }
  12.  
  13. int main(){
  14. Student stu1;//调用构造函数1
  15. Student stu2("Tomwenxing");//调用构造函数2
  16. Student stu3("Tomwenxing",);//调用构造函数3
  17. Student stu4("Tomwenxing",,"male");//调用构造函数4
  18. return ;
  19. }

5.构造函数可以在类中定义,也可以在类外定义

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Student{
  5. public:
  6. Student(){}
  7. Student(string name){//类内定义构造函数
  8. this->name=name;
  9. }
  10. Student(string name,int age);//类内声明构造函数,类外定义构造函数
  11. private:
  12. string name;
  13. int age;
  14. };
  15.  
  16. Student::Student(string name,int age){ //类外定义构造函数
  17. this->name=name;
  18. this->age=age;
  19. }
  20.  
  21. int main(){
  22. Student stu1;
  23. Student stu2("Tomwenxing");
  24. Student stu3("Tomwenxing",);
  25. return ;
  26. }

6.如果类定义中没有定义任何一个构造函数,C++编译器会自动给出一个缺省的构造函数(称为默认构造函数):

  1. 默认构造函数:类名(){}

但是,只要我们手动定义了一个构造函数,系统就不会再为我们自动生成缺省的默认构造函数了,如果仍希望类中由默认构造函数,需要编程者自己手动定义

[特别注意]:

只要构造函数是无参的或者只要各参数均有缺省转值的,C++编译器都认为是缺省的构造函数,因此缺省的构造函数在类定义中至多只能有一个

  1. #include<iostream>
  2. using namespace std;
  3. class Student{
  4. public:
  5. Student(){} //构造函数1
  6. Student(int value=){//构造函数2
  7. this->value=value;
  8. }
  9. Student(int value=,int value2=){//构造函数3
  10. this->value=value;
  11. this->value2=value2;
  12. }
  13. private:
  14. int value;
  15. int value2;
  16. };
  17. int main(){
  18. Student stu1; //错误:不知道调用哪个构造函数
  19. return ;
  20. }

7.构造函数初始化列表:负责为新创建的对象的一个或几个数据成员赋初值。其中构造函数初始值是成员名字的一个列表,每个名字后面紧跟括号括起来的(或者在花括号内的)成员初始值,且不同成员的初始化通过逗号分开。

  1. #include<iostream>
  2. using namespace std;
  3. class Student{
  4. public:
  5. Student(){}//手动定义默认构造函数
  6. Student(int value1):Value(value1){}//构造函数初始化列表
  7. Student(int value1,int value2);
  8. private:
  9. int Value;
  10. int Value2;
  11. };
  12. Student::Student(int value1,int value2):Value(value1),Value2(value2){}
  13. int main(){
  14. Student stu1();
  15. Student stu2(,);
  16. return ;
  17. }

二、构造函数的三个作用

作用1: 创建对象。当类的对象被创建时,编译系统会为该对象分配内存空间,并自动调用构造函数从而创建该对象

作用2:对创建的对象进行初始化。通常构造函数会在对象被创建的同时对该对象中的成员变量进行初始化。

作用3:类型转换

[作用3的理解]:

理解构造函数的作用3之前,首先需要理解C++中数据类型隐式转换的原理。例:

  1. double value=,;
  2. int new_value=value; //new_value的值是12

上例是C++中常见的不同数据类型之间的隐式转换。C++编译器在编译这种隐式转换语句时会将语句改写成如下情况:

  1. double value=12.59;
  2. 2 int temp=value;//定义一个临时变量,并用变量value的值对其进行初始化
  3. int new_value=temp;

也就是说C++编译器会定义一个临时变量并用temp并用double类型的变量value对其进行初始化,然后再在int类型变量new_value创建时用临时变量temp来对其进行初始化,从而完成不同数据类型之间的隐式类型转换。

同理,C++中也可以利用类中的构造函数来完成不同类型数据之间的转换

  1. #include<iostream>
  2. using namespace std;
  3. class Test
  4. {
  5. public:
  6. Test()=default; //在C++11新标准下,可以通过在参数列表后面写上=default来要求编译器生成默认的构造函数(即Test(){})
  7. Test(int d):value(d){ //构造函数1
  8. cout<<"调用了构造函数1"<<endl;
  9. }
  10. Test(double d):value2(d){ //构造函数2
  11. cout<<"调用了构造函数2"<<endl;
  12. }
  13. private:
  14. int value;
  15. double value2;
  16. };
  17.  
  18. int main(){
  19. Test test1,test2;
  20. test1=;//调用构造函数1来进行类型转换
  21. test2=12.5;//调用构造函数2来进行类型转换
  22. return ;
  23. }

当C++编译器对语句test1=100;进行编译时,会先利用整数类型数字100调用类的构造函数1来创建一个临时的Test类的对象temp,然后在再临时对象temp赋值给对象test1,也就是会将语句test1=100;转换成下列语句:

  1. Test temp();
  2. test1=temp;

C++编译器对语句test2=12.5;的处理同上,会先利用双精度浮点类型数字12.5调用类的构造函数2来创建一个临时的Test类的对象temp,然后再将临时对象temp赋值给对象test2

  1. Test temp(12.5);
  2. test2=temp;

如果键类中的构造函数1和构造函数2注释掉,则语句test1=100;和语句test2=12.5;将会报错,因为编译器在类中找不到构造函数来对其进行类型转换

C++:构造函数1——普通构造函数的更多相关文章

  1. C++转换构造函数与类型转换构造函数

    转换构造函数: 转换构造函数的只有一个形参: Student(float s) { score = s; age = ; } 如果已经在上面定义了构造函数: Student(); //建立对象c1,由 ...

  2. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html   类string的构造函数.拷贝构造 ...

  3. c++ 构造函数,拷贝构造函数,析构函数与赋值操作符

    题目: 为下面的Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数. class Shape { int no; }; class Point { int x; int y; }; ...

  4. C++中的构造函数,拷贝构造函数和赋值运算

    关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...

  5. C++的转换构造函数、拷贝构造函数、赋值运算符重载

    1 转换构造函数     C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...

  6. 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数

    一.题目: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &othe ...

  7. <转载>构造函数与拷贝构造函数

    原文地址http://www.cnblogs.com/waynelu/archive/2012/07/01/2572264.html 构造函数 构造函数.析构函数与赋值函数是每个类最基本的函数. 对于 ...

  8. C++结构体:默认构造函数,复制构造函数,重载=运算符

    C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就 ...

  9. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...

  10. 请为CMyString类型编写构造函数、copy构造函数、析构函数和赋值运算符函数。

    如下为类型CMyString的声明,请为该类型编写构造函数.copy构造函数.析构函数和赋值运算符函数. class CMyString { public: CMyString(const char* ...

随机推荐

  1. 基于 HTML5 Canvas 的机房温度云图展示

    前言 在物联网的大趋势下,机房的设备信息以及一些环境信息变成了数据摆在了人们面前.在这个大数据的时代,数据的可视化不仅体现在数据值本身,更应该通过数据的变化来获取一些信息.我们今天的主题,机房温度云图 ...

  2. 微信小程序实现转义换行符

    在html中可以直接使用<br />换行,但是小程序wxml中使用<br />无效,可以换成\n Page({ data: { title: '至少5个字\n请多说些感受吧' ...

  3. java 加载并读取Properties 文件

    1 .系统自带的application.properties  (以下代码仅供参考,不能粘贴复制) 假设application.properties文件有下面两个值: come.test.name = ...

  4. 关于if与switch的使用与区别

    这是if语句: if (条件表达式1){ //条件判断 //n多语句1 }else if(条件表达式2){ //n多语句2 }else if(条件表达式3){ //n多语句3 } ... ... el ...

  5. 搭建iSCSI共享IPSAN

    iSCSI(internet SCSI)是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择. ...

  6. django中models的filter过滤方法

    __gt     大于__gte   大于等于 __lt      小于 __lte    小于等于 __in     存在于一个list范围内 __startswith    以...开头 __is ...

  7. 20155327 学习基础和C语言基础调查

    20155327 学习基础和C语言基础调查 通过阅读老师推荐的五篇文章之后,其中有几个点引发了我的思考,便是"量变引起质变""循序渐进"以及"坚持&q ...

  8. 【SCOI2009】迷路

    题面 题解 如果给我们的是一个邻接矩阵,那么直接给邻接矩阵\(T\)次幂即可. 这里的图有边权,那么我们就将它拆成\(9\)个点即可. 代码 #include<cstdio> #inclu ...

  9. 【vijos1049】送给圣诞夜的礼品

    题面 描述 当小精灵们把贺卡都书写好了之后.礼品准备部的小精灵们已经把所有的礼品都制作好了.可是由于精神消耗的缘故,他们所做的礼品的质量越来越小,也就是说越来越不让圣诞老人很满意.可是这又是没有办法的 ...

  10. Unity商店下载的文件保存路径?

    Win7系统: C:\Users\系统用户名\AppData\Roaming\Unity\Asset Store MAC:"~/Library/Unity/Asset\ Store" ...