在C++中,有一种特殊的成员函数,他的名字和类相同,没有返回值,不需要用户显示调用,用户也无法调用,而是在创建对象的时候自动执行。

这种特殊的函数就是构造函数 Constructor

构造函数的名字与类相同,所以构造函数与类相依而生。以Color类作为例子:

class Color //Color是类的名称,首字母大写
{ //括号里面是成员变量和成员函数,统称为类的成员Member
public:
Color(); //声明无参构造函数
~Color(); // 析构函数
Color(int r, int g, int b); // 声明有参构造函数
void set_color(char r, char g, char b);//成员函数
void display();
//void set_color_hsb(char h, char s, char b);
int color_16(); private:
int m_red; //类的成员变量一般在前面加 m_//只是变成习惯
int m_green;
int m_blue;
int m_my_color; };//后面需要一个;

一个类必须有构造函数,要么用户自己定义,要么编译器自动生成;

如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,没有形参,也不执行任何操作,

构造函数必须是public 属性的,否则创建对象时无法调用。当然设置为private,protected 属性也不会报错,但是没有意义。

构造函数没有返回值,因为没有变量来接收,这意味着,构造函数函数名前面不能出现返回值类型,void 也不行,函数体内也不能有return。

比如上面Color类,如果不定义构造函数的时候,编译器会生成一个

Color(){}

实际上编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空

默认构造函数的目的是帮助编译器做初始化工作,而不是帮程序员

1、无参构造函数:构造函数内无形参

Color::Color()
{
m_red = ;//初始化成员变量
m_green = ;
m_blue = ;
}

2、有参构造函数:r、g、b 是构造函数的三个形参,

一下通过两种方式定义构造函数

Color(int r, int g, int b)的作用是给三个private属性的成员变量赋值,要想调用该构造函数,就得在创建对象的同时传递实参,并且实参由()包围,和普通的函数调用类似
在函数体内初始化成员变量
Color::Color(int r, int g, int b) {
m_red = r;
m_green = g;
m_blue = b;
}
//在栈上创建3个Color对象,
Color Red(, , );
Color Green(, , );
Color Blue(, , );
通过初始化列表来初始化成员变量,在效率上和在构造函数体内初始化变量是一样的,没有优势,仅仅是在书写上方便,尤其是成员变量较多时,这种写法非常简单明了,但鄙人不敢苟同。
Color::Color(int r, int g, int b) : m_red(r), m_green(g), m_blue(b) { }

构造函数初始化列表还有一个重要的作用,初始化const成员,初始化const成员变量的唯一方法就是使用初始化列表

C++中构造函数和普通函数一样,允许重载,一个类中有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪个构造函数;

类中定义了构造函数就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配

C++构造函数的几种使用方法的更多相关文章

  1. (copy)赋值构造函数的4种调用时机or方法

    第一种调用方法: demo #include <iostream> using namespace std; class Text { public: Text() // 无参数构造函数 ...

  2. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  3. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  4. java 中的几种 "通用方法“

    前言 Java中,除了基本的数值类型,其他所有数据类型(包括数组)都是对象. 而Object这个类是所有类的超类,它提供的方法,自然能够使用于它的所有子类(所有非基本数值类型). 本文介绍了Objec ...

  5. C#窗体间通讯的几种处理方法

    应用程序开发中,经常需要多窗体之间进行数据通信,写几个例子,把几种常用的通信方式总结一下: 主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是Tex ...

  6. js中this的四种使用方法

    0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...

  7. 解密SuperWebview的一种另类方法

    解密SuperWebview的一种另类方法 什么是SuperWebview SuperWebview是APICloud官方推出的另一项重量级API生态产品,以SDK方式提供,致力于提升和改善移动设备W ...

  8. JavaScript 继承——三种继承方法及其优劣

    原文地址   本文内容 目的 继承的第一步--最简单的继承 私有变量/成员和原型 三种继承方式及其优劣 基本的原型继承 Yahoo JavaScript 模块模式 创建闭包的构造函数 三种方法的代码执 ...

  9. 将dll文件注入到其他进程中的一种新方法

    http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将 ...

随机推荐

  1. Javascript脚本语言

    找组件用 id (唯一) 2.name 样式 使用分类 1 页面中 2 建JS文件 可以放在head也可以在body 工作区可以有 1 全局变量 2 由多个函数构成 标签编辑器 onChange 改变 ...

  2. HashSet源码学习,基于HashMap实现

    HashSet源码学习 一).Set集合的主要使用类 1). HashSet 基于对HashMap的封装 2). LinkedHashSet 基于对LinkedHashSet的封装 3). TreeS ...

  3. Ubuntu改坏sudoers后无法使用sudo的解决办法

    练习安装odoo的时候,创建了一个odoo用户,想把它赋予sudo权限,然而,编辑的时候不留意,改坏了,导致sudo无法使用,无法编辑sudoers文件修改回来. 总提示如下信息: >>& ...

  4. Redis的面试问题总结,面试跳槽必备

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  5. 为宇宙第一强的IDE干一票

    背景 在博客园看到很多人说.net在国内已死,很多人在为.net前途担忧,包括一些创业大佬也提及到这些问题,提及到客户指定了说使用php或者java. 那么基本可以确认了,.net 处于风雨漂泊的地位 ...

  6. 从零开始入门 K8s | 深入剖析 Linux 容器

    作者 | 唐华敏(华敏)  阿里云容器平台技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 15 讲. 关注"阿里巴巴云原生"公众号,回复关键词 ...

  7. createTextNode

    createTextNode()方法将创建一个包含给定文本的新文本文档节点.这个方法的返回值是一个指向新建文本节点的引用指针: reference = document.createTextNode( ...

  8. 【数据结构】之串(C语言描述)

    串(字符串)是编程中最常用的结构,但 C语言 中没有“字符串”这种变量,只能通过字符数组的形式表示字符串. C语言 为我们提供了一个 string.h 的头文件,通过这个头文件,我们可以实现对字符串的 ...

  9. java this,super简单理解

    *****this****** 表示对当前对象的引用. 作用:1.区分实例变量和局部变量(this.name----->实例变量name) 2.将当前对象当做参数传递给其它对象和方法.利用thi ...

  10. Vue+ElementUI项目使用webpack输出MPA【华为云分享】

    [摘要] Vue+ElementUI多页面打包改造 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目 ...