栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++ Primer读书笔记】第7章 类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++ Primer读书笔记】第7章 类

文章目录

定义抽象数据类型

定义类

this指针const成员函数 构造函数

默认构造函数构造函数初始值列表 访问控制与封装

友元 类的其他特性

可变数据成员从const成员函数返回*this类的声明 构造函数

构造函数初始值列表

必须提供初始值的情况成员初始化的顺序默认实参 隐式的类类型转换

抑制构造函数定义的隐式转换为转换显式地使用构造函数

定义抽象数据类型 定义类 this指针

调用成员函数时,用请求该函数的对象的地址初始化this,*this返回的是该对象的引用,this是一个常量指针

const成员函数

const的作用是修改隐式this指针的类型,表示this是一个指向常量的指针,该函数不会修改任何成员变量

std::string isbn() const { return this->bookNo; }
构造函数

控制对象的初始化过程

默认构造函数

默认构造函数没有实参

如果类没有定义任何构造函数,则编译器会合成默认构造函数。如果类定义了其它的构造函数,而没有定义默认构造函数,编译器也不会为类合成默认构造函数

合成的默认构造函数将按如下规则初始化类的数据成员:

若存在类内初始值,用它来初始化成员否则,默认初始化该成员 构造函数初始值列表

Sales_data(const std::string &s, unsighed n, double p): bookNo(s), units_sold(n), revenue(p*n) { }

不在构造函数初始值列表中的成员将使用类内初始值初始化,或默认初始化

访问控制与封装

struct:成员默认是public的
class:成员默认是private的

友元

友元(类或函数)可以访问类的非public成员,友元不是类的成员,但必须在类内声明友元

class Sales_data
{
    friend Sales_data add(const Sales_data&, const Sales_data&);
    // 其它成员
    ......
}
类的其他特性 可变数据成员

mutable成员永远不会是const,可以被const成员函数修改,任何成员函数都能改变它的值

class Screen
{
public:
    void some_menber() const { ++access_ctr; }
private:
    mutable size_t access_ctr;
}
从const成员函数返回*this

返回的是常量引用

如果需要返回非常量引用,则需要针对const重载,实现两个版本的函数,根据隐式传入的*this指针决定使用const或非const版本

类的声明

类被声明后就可以定义指向这种类型的指针或引用,而不必等到类被定义后,但不能在类中定义类类型的成员,因为此时编译器还不知道要为类的对象分配多少空间

类在编译时先编译成员声明,再编译成员函数体,所以成员函数中可以使用类内定义的任何名字

构造函数 构造函数初始值列表 必须提供初始值的情况

如果成员是const或引用,则必须将其初始化

class ConstRef
{
public:
    ConstRef(int ii);
private:
    int i;
    const int ci;
    int &ri;
}

ConstRef::ConstRef(int ii)
{
    // 在函数体执行前初始化,函数体中是赋值
    i = ii;
    ci = ii;    // 错误,不能给const赋值
    ri = i;     // 错误,ri未被初始化
}

// 正确,显式地初始化引用和const成员
ConstRef::ConstRef(int ii) : i(ii), ci(ii), ri(i) { }
成员初始化的顺序

成员初始化的顺序和它们在类定义中出现的顺序一致

默认实参
Sales_data(std::string s = ""): bookNo(s) { }
隐式的类类型转换

转换构造函数:如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制

string null_book = "9-999-99999-9";
item.conbine(null_book);

用null_book隐式创建了一个Sales_data对象,只允许一步类类型转换

抑制构造函数定义的隐式转换

将构造函数声明为explicit

explicit Sales_data(std::string &s): bookNo(s) { }

item.combine(null_book);    // 错误,string构造函数是explicit的
为转换显式地使用构造函数
item.combine(Sales_data(null_book));
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号