第四篇:C++ 构造函数的初始化和const的用法

前文:
在定义变量和对象时,可以立即为它们指定初始值。 始终使用其可用构造函数之一初始化类类型对象。 C已经支持数组和结构初始化列表,该列表由一对花括号包围的常量表达式列表组成。

C ++支持类似的初始化,称为一致性初始化(Uniform initialization)。 它使用以下语法:

Type obj {val_list};

当使用对象列表定义对象时,每个单独的对象可以使用其自己的一致性初始化

一致性初始化可用于初始化对象或变量,也可用于初始化构造函数中的数据成员或隐式地在函数的return语句中。 例子:

class Person{
      public:
            Person(std::string const &pname, std::string const paddr,size_t age):
                d_name {name},d_addr {paddr},d_age {age}
            {}
}

default和delete

在类设计中经常遇到两种情况:

  • 提供构造函数的类显式必须定义默认构造函数;
  • 类(例如,实现流的类)不能通过从该类的现有对象拷贝(称为复制构造)来初始化对象,并且不能将对象分配给彼此。

一旦类定义了至少一个构造函数,其默认构造函数就不会被编译器自动定义。 C ++通过提供“= default”语法来放松这种限制。 使用其默认构造函数声明指定`= default'的类指示应由编译器提供普通的默认构造函数。 一个普通的默认构造函数执行以下操作:

  • 该类的内置类型的数据成员尚未初始化。
  • 其组合(类类型)数据成员由其默认构造函数初始化。
  • 如果该类派生自基类,则基类由其默认构造函数初始化。

还可以为复制构造函数,重载赋值运算符和析构函数提供简单的实现。

const成员函数和const对象

关键字const通常用在成员函数参数列表后面。 此关键字表示成员函数不会更改其对象的数据成员。 这些成员函数称为const成员函数。 在Person类中,我们看到访问器函数被声明为const:

class Person
{
    ....
    const std::string name() const;
    const std::string address() const;
    const std::string contact() const;
    const size_t age() const;
    .....
};

经验法则:关键字const左侧出现的任何一个,都不会改变。 对于成员函数,这应该被解释为“不改变自己的数据”
实现const成员函数时,必须重复const属性:

const std::string Person::name() const{
      return d_name;
}

const std::string Person::address() const{
    return d_address;
}

const成员函数用于防止无意中修改数据。 除了构造函数和析构函数之外,只有const成员函数可以与const对象(plain,引用或指针)一起使用。

const对象经常作为const &出现在函数的参数中。 在这些函数内部,只能使用对象的const成员。 这是一个例子

void display_person(Person const &p)
{
    cout << "姓名:" << p.name() << endl;
    cout << "地址:" << p.address() << endl;
    cout << "电话:" << p.contact() << endl;
    cout << "年龄:" << p.age() << endl;
};

const成员函数属性可用于重载成员函数。 当函数被const属性重载时,编译器使用最接近对象的const限定的成员函数,请参考如下示例:
类接口的定义:声明了两个不同版本的函数原型

class Person{
      ....
      void show_age();
      void show_age() const;
      ....
}

类实现:我们对show_age成员函数重载了一个常量版本的和非常量版本的

void Person::show_age(){
    cout << "非const版本: " << d_name << "今年" << d_age << "岁" << endl;
}

void Person::show_age() const{
    cout << "const版本: " << d_name << "今年" << d_age << "岁" << endl;
}

正如下面的调用示例,我们分别创建了一个常量版本的Person 对象 list和非常量版本的Person对象 yanlan。

  • 当对象是const对象时,只能使用const成员函数。
  • 当对象不是const对象时,使用非const成员函数,除非只有const成员函数可用。 在这种情况下,使用const成员函数。

类设计的一般原则成员函数应始终赋予const属性,除非它们的作用实际上是用于修改了对象的数据成员

#include "./person.cpp"
#include <iostream>

int main(int argc, char const *argv[])
{
    /* code */
    Person const lisa = Person{"Lisa", "东台路117号A座", 23};
    Person yalan = Person{"Yan Lan", "沙金路4栋618", 38};

    lisa.show_age();
    yalan.show_age();
    return 0;
}

输出效果


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容