【c++Primier】第十二章 类

有关类的一些重要知识点:

  • 类定义了数据成员和函数成员:
    • 数据成员用于存储与该类类型的对象相关联的状态,而函数成员则负责执行赋予数据意义的操作。
    • 最简单的来说,类就是定义了一个新的类型和一个新的作用域。
  • public和private关键字
    • 在public部分定义的成员可被使用该类型的所有代码访问;
    • 在private部分定义的成员可被其他类成员访问。
    • 所有成员必须在类的内部声明,一旦类定义完成后,就没有任何方式可以增加成员了。
  • 在类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默认为inline。
  • 类定义语句:double avg_price() const;
    • const成员不能改变其所操作的对象的数据成员,const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。
  • struct和class关键字的区别
    • 如果类是用struct关键词定义的,则在第一个访问标号(public,private,protected)之前的成员都是公有的;
    • 如果类是用class关键字定义的,则这些成员是私有的。
  • 在普通的const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。
  • 有时(但不是很经常),我们希望类的数据成员(甚至在const成员函数内)可以修改。这可以通过将它们声明为mutable来实现。
  • 构造函数的名字与类的名字相同,并且不能指定返回类型。像其他任何函数一样,它们可以没有形参,也可以定义多个形参。与其他函数不同的是,构造函数还可以包含一个构造函数初始化列表,构造函数初始化式只在构造函数的定义中而不是声明中指定。如下:
    • Sales_item::Sales_item(const string &book):isbn(book), units_sold(0), revenue(0.0){}

        从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。

        必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用值初始化式。

        构造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。第一个成员首先被初始化,然后是第二个,依次类推。

  • 只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。如果类包含内置或者复合类型的成员,则该类不应该依赖于合成的默认构造函数。它应该定义自己的构造函数来初始化这些成员。
  • explicit关键字只能用于类内部的构造函数声明上。在类的定义体外部所做的定义上不再重复它。例如:
class Sales_item{
public:
        explicit Sales_item(const std::string &book = ""):isbn(book), units_sold(0), revenue(0.0){}
        explicit Sales_item(std::istream &is);
};

//error:explicit allowed only on consturctor declaration in class header
explicit Sales_item::Sales_item(istream& is){
        is >> *this; //use Sales_item input operator to read the members
}

        现在,两个构造函数都不能用于隐式地创建对象。以下两个使用都不能编译:

string null_book = "9-999-99999-9";

item.same_isbn(null_book); //error:string constructor is explicit

item.same_isbn(cin); //error:istream constructor is explicit

        通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。例如:

string null_book = "9-999-99999-9";

item.same_isbn(Sales_item(null_book));

  • 友元
    • 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以他们不受其声明出现部分的访问控制影响。
    • 友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。
  • static类成员
    • static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联。即static成员是类的组成部分但不是任何对象的组成部分。
    • static成员不能被声明为const。因为将成员函数声明为const就是承诺不会修改该函数所属的对象。
    • static成员函数也不能被声明为虚函数。
    • 当我们在类的外部定义static成员时,无须重复指定static保留字,该保留字只出现在类定义体内部的声明处。
    • 非const的static成员的初始化要放在类定义体的外部。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值