我是靠谱客的博主 欣慰冷风,最近开发中收集的这篇文章主要介绍【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));

最后

以上就是欣慰冷风为你收集整理的【C++ Primer读书笔记】第7章 类的全部内容,希望文章能够帮你解决【C++ Primer读书笔记】第7章 类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部