7个月之后的补充: 说真的,别再收藏这篇文章了,写的真的很拉跨,建议学习并收藏C++ 六个默认成员函数 + this指针_CPP的底层是哲学的博客-CSDN博客

也是我写的,质量会好很多!!!!!!

前言:

因为类对象的数据成员的值是很重要的 而对类对象数据成员初始化这一重要而频繁的操作 当然越简便越好 所以这里讲的就是对对象数据成员初始化的一些方法

9.1.1 对象的初始化

1. 在声明类时直接对数据成员进行初始化 如下所示

在某红书中说到 在声明类时对数据成员初始化是不对的 但是在 c++11标准下 是允许在声明类时 对数据成员直接赋初值的 因为这本书比较落后了 所以内容没有更新 在vs2019中 这种方法是没有报错的 但是注意考试的时候要填不能在声明类时直接对数据成员赋初值

2. 把数据成员声明为公用成员

把数据成员声明为公用成员后 在定义对象时 可以像定义结构体变量那样对数据成员初始化 但是绝大多数情况下 数据成员都不会声明为公用的 所以这种方法并不可取

9.1.2 用构造函数实现数据成员的初始化

c++提供了构造函数来处理对象的初始化

①  用户不能调用构造函数,在建立对象时自动执行,且只能执行一次。一般声明为public

②  构造函数是在声明类的时候由类的设计者定义的,程序用户只须在定义对象的同时指定数据成员的初值即可。

③  构造函数名必须和类名同名,不能随意命名。

④  构造函数不具有任何类型,不具有返回值。 可以有参数。

⑤  可以用一个类对象初始化另一个类对象 如 Time t1;  Time t2 = t1;  这样就把t1的各数据成员的值复制到t2相应的各成员 而不调用t2的构造函数Time();

⑥  构造函数的函数体中还可以包含如cout的其他语句 但是不推荐这样做

⑦  如果类的定义者没有自己定义构造函数,则c++系统会自动形成一个构造函数,这个构造函数函数体是空的,没有参数,不执行任何操作。

class Time
{
public:Time(){hour = 0;minute = 0;sec = 0;}void set_time();void show_time();
private:int hour;int minute;int sec;
};void Time::set_time()
{cin >> hour >> minute >> sec;
}void Time::show_time()
{cout << hour << ":" << minute << ":" << sec << endl;
}int main()
{Time t1;t1.set_time();t1.show_time();Time t2;t2.show_time();return 0;
}

这是构造函数的一个很简单的运用 这里的构造函数的功能是 给对象的数据成员赋初值为0  建立对象t1时调用构造函数  对象t1再调用了set_time函数 重新赋了一次值  而t2中的数据成员的值都是0

构造函数同样可以在类内声明  在类外定义  同样需要声明构造函数的所属类 以及作用于限定符  即

9.1.3  带参数的构造函数

引:上方给出的构造函数,是十分死板的。每个建立的对象都有同样的初始化值,无法达到不同对象不同初始化值的效果。所以有了带参数的构造函数。

即构造函数的参数列表中加若干参数 并在函数体中对不同数据成员赋值。 这样在建立对象并执行构造函数时,就可以把定义对象时给的一些数据赋给数据成员。

构造函数的实参只能在定义对象时给出,即建立对象的同时给出数据成员的初值。

// 带参数的构造函数
class Cube
{
public:int volume();Cube(int, int, int);
private:int length;int width;int height;
};
Cube::Cube(int a, int b, int c)
{length = a;width = b;height = c;
}
int Cube::volume()
{return length * width * height;
}
int main()
{//Cube c1 = { 10,20,30 };     Cube c1(10, 20, 30);    //建立对象c1 并指定c1的长宽高  直接在后面加括号就行;cout << "c1的体积为:" << c1.volume() << endl;Cube c2(10, 10, 10);cout << "c2的体积为:" << c2.volume() << endl;return 0;
}

带参数的构造函数的声明以及类对象的定义方法如上所示,注意main函数中第一行第二行的方式都可以, 第二种可以看成给构造函数的形参赋实参。类似于函数调用。

9.1.4  用参数初始化表对数据成员初始化

不在构造函数函数体内执行初始化语句,放在函数首部实现。让构造函数显得简短精炼,就可以在类体内定义构造函数而不在类外定义。尤其当数据成员较多时更显其优越性,许多c++程序人员都喜欢用这种方式初始化所有数据成员。

// 参数初始化表对数据成员初始化
#include<string.h>
class cube
{
public:cube(int l, int w, int h,string n) :length(l), width(w), height(h) ,name(n)  //参数初始化表{//strcpy(arr, brr);}void show();
private:int length;int width;int height;//char arr[10];string name;
};void cube::show()
{cout << name << ":" << length * width * height << endl;
}
int main()
{cube c1(10, 20, 30, "yang");c1.show();cube c2(10, 10, 10, "li");c2.show();return 0;
}

格式如上,即: 在构造函数的函数首部后方再加一个冒号后面给出对应的值

注意:对于数组的初始化不可以像其他数据那样 因为数组不可以直接用等于号赋值(string可以)需要用strcpy这样的字符数组操作函数进行初始化。

9.1.5  构造函数的重载

即多个构造函数同名,但参数的个数不同,或参数的类型不同的构造函数。称为构造函数的重载

class Box
{
public:int volume();Box(int l, int w, int h) :length(l),width(w),height(h){}  //有三个参数的构造函数Box(int l,int w):length(l),width(w)                       //有两个参数的构造函数{height = 10;}Box(int l) :length(l)                                      //有一个参数的构造函数{width = 10;height = 10;}Box();                                                   //无参构造函数
private:int length;int width;int height;
};int Box::volume()
{return length * height * width;
}Box::Box()
{length = 10;width = 10;height = 10;
}int main()
{Box b1;cout << "b1的体积为:" << b1.volume() << endl;Box b2(20, 20, 20);cout << "b2的体积为:" << b2.volume() << endl;Box b3(20, 20);cout << "b3的体积为:" << b3.volume() << endl;Box b4(20);cout << "b4的体积为:" << b4.volume() << endl;return 0;
}

9.1.6  使用默认参数的构造函数

构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。

class cube
{
public:cube(int l = 10, int w = 10, int h = 10):length(l),width(w),height(h){}void show();
private:int length;int width;int height;
};void cube::show()
{cout << "length=" << length <<"  " << "width=" << width <<"  " << "height=" << height << endl;
}int main()
{cube c1(20, 20, 20);c1.show();cube c2(20, 20);c2.show();cube c3(20);c3.show();cube c4;c4.show();return 0;
}

可以看到,在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。它的好处是:即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便,不需输人数据,对象全按事先指定的值进行初始化。

注意:

(1)在建立对象时不必给出实参的构造函数,称为默认构造函数( defaultconstructor)。显然,无参构造函数属于默认构造函数。一个类只能有一个默认构造函数。如果用户未定义构造函数,则系统会自动提供一个默认构造函数,但它的函数体是空的,不起初始化作用。如果用户希望在创建对象时就能使数据成员有初值,就必须自己定义构造函数。

(2)  应该在什么地方指定构造函数的默认参数?应在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。因为类声明是放在头文件中的,它是类的对外接口,用户是可以看到的,而函数的定义是类的实现细节,用户往往是看不到的。(类声明和类定义会放在两个文件中)。在声明构造函数时指定默认参数值,使用户知道在建立对象时怎样使用默认参数。

(3)程序第5行在声明构造函数时,形参名可以省略,即写成Box ( int = 10 , int = 10 , int = 10);

(4)如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。由于不需要实参也可以调用构造函数,因此全部参数都指定了默认值的构造函数也属于默认构造函数。前面曾提到过:一个类只能有一个默认构造函数,也就是说,可以不用参数而调用的构造函数,一个类只能有一个。其道理是显然的,是为了避免调用时的歧义性。

(5)在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。自行理解为什么

(6)  但如果构造函数中的参数并非全部为默认值时,(即部分指定默认值)就要分析具体情况。不是一定会出错,是很容易出错,要十分仔细。因此,一般不应同时使用构造函数的重载和有默认参数的构造函数。

总结:

(上方6点是我复制的= =) 构造函数,就是一个在对象建立时自动执行的函数,作用就是方便给对象的数据成员赋初值。 核心就是有参数的构造函数以及有默认参数的构造函数。 我认为这种是最方便的,在建立对象时可直接指定该对象的数据成员的值。

析构函数

析构函数是与构造函数作用相反的函数  当对象的生命期结束时,会自动执行析构函数。

析构函数不返回任何值,没有函数类型,也没有函数参数。由于没有函数参数,因此它不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数。
实际上,析构函数的作用并不仅限于释放资源方面,它还可以被用来执行“类的设计者希望在最后一次使用对象之后所执行的任何操作”,例如输出有关的信息。

如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作都不进行。想让析构函数完成任何工作,都必须在定义的析构函数中指定。

调用构造函数和析构函数的顺序

一般情况下: 先构造的后析构,后构造的先析构。

构造函数和析构函数在面向对象的程序设计中是相当重要的,是类的设计中的一个重要部分。

【C++】构造函数 利用构造函数对类对象进行初始化相关推荐

  1. 【C++】利用构造函数对类对象进行初始化

    运行环境:VS2017 一.对象的初始化 每一个对象都应当在它建立之时就有就有确定的内容,否则就会失去对象的意义. class Time {int hour = 0;int min = 0;int s ...

  2. iOS类对象的初始化+initialize

    简介 在iOS中,对象可分为类对象和实例对象,实例对象即我们平时alloc init初始化的一个具体的对象,实例对象所属的类,称为类对象.类对象.实例对象 +initialize 是一个类方法,在iO ...

  3. C++ : 构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景

    构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景 #include <iostream> using namespace std;class Construct ...

  4. 2020.10.25 对象的创建 利用构造函数创建对象 遍历对象属性 遍历函数属性和属性数值for in 内置对象

    输出遵循变量的值就近原则 对象创建方法 : 第一种 var obj = { uname:'dengzhu',//属性的创建,多个属性创建之间用逗号隔开 sex: male; sayHi: functi ...

  5. 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

    文章目录 I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ...

  6. android 怎么初始化下拉框_第30讲:“二师兄”的成长历程之二,类属性的初始化...

    在上一篇中我们建立了一个极为简单的pigsy类,在这个类中我们定义了三个属性,一个方法.在谈到类对象在初始化的时候,我们特意的指出:某些属性可以通过自动初始化来设置,这样也会省去你一些麻烦.这就是本篇 ...

  7. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  8. C++类对象的拷贝构造函数(转载)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...

  9. C++利用构造函数限制对象的创建

    总的一句话概括:限制创建那些完全没有初始化的对象.那种对象没意义.所以我们要尽量限制掉默认构造函数,自己写一个带参数的初始化构造函数. 首先需要知道的是我们是在什么样的情况下才需要限制对象的创建.限制 ...

最新文章

  1. 网站服务器部署注意事项,服务器部署改云部署注意事项
  2. TextView使用实例
  3. Linux IPv6 UDP套接字编程示例
  4. ob_start ob_end_clean的用法 fetch
  5. 最后的代课老师———漆红玉[转]
  6. capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...
  7. 构建灵活工作方式 戴尔最智能商用客户端产品线全面上市
  8. linux输入influxdb密码,在RHEL 8/CentOS 8上安装InfluxDB的方法
  9. PHP Xdebug调试专题
  10. 用SQL语句创建学生表
  11. [科研自学神器]中国大学MOOC下载器
  12. 统一社会信用代码及其校验规则
  13. IOS版Telegram启用中文界面的方法
  14. 最大信息熵增益_信息熵(Entropy)、信息增益(Information Gain)
  15. 宝塔安装的数据库外网无法访问
  16. 【数据结构】表达式建树
  17. 不平等博弈_不平等与全球性大流行:完美的风暴?
  18. CS224W图机器学习笔记5-消息传递与节点分类
  19. mysql学习-Innodb行格式compact行记录解析
  20. 计算机无法注册打印机,电脑中打印机添加不了怎么办

热门文章

  1. 如何自定义百度云常用服务器,经验分享:如何将百度云做成网站文件服务器
  2. 方便你我他,百科全书:)
  3. 基于单片机的血压计设计
  4. R语言回归分析-异常观测值
  5. 新手选车系列之(五): 手动挡还是自动挡
  6. STM32F103ZE TFT液晶代码移植
  7. 利用DISM修复WIN11的系统组件错误
  8. 我的物联网项目(三十一) 分销模式电商平台
  9. MATLAB未定义变量example,小虫求助“ 未定义函数或变量 'Beam_InputData547'。
  10. 那些让你起飞的计算机基础知识!