十二章 札记--C++ primer 之旅

类成员: 可以使数据、 函数 或者 类型别名 typedef 定义的

所有成员必须在类的内部声明。

构造函数: 一般使用一个构造函数初始化列表 来初始化对象的数据成员。

                EX: Sales_item() : units_sold(0),  revenue(0.0) {} 

               构造函数初始化式只在构造函数的定义中而不是声明中指定。

注意: 省略初始化列表并在构造函数的函数体内对数据成员赋值是合法的。是赋值,不是初始化。
      
构造函数分两个阶段执行: 1) 初始化阶段;2)普通的计算阶段    注: 计算阶段由构造函数函数体中的所有语句组成。

    注: 不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。

    注: 有些成员必须在构造函数初始化列表中进行初始化。EX: 没有默认构造函数的类类型的成员,以及const或引用类型的成员

初始化顺序:构造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序。

注意: 通常,在默认构造函数中给成员提供的初始值应该指出该对象是空的。


函数成员: 类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默认是inline 的。

const 成员不能改变其所操作的对象的数据成员。const 必须同时出现在声明和定义中。

访问标号实施抽象和封装:
     类型的数据抽象视图由其public 成员定义。
     private 封装了类型的实现细节。

具体类型和抽象类型: 并非所有的类型都必须是抽象的。标准库的pair 类就是一个具体类。具体类会暴露而非隐藏起实现细节。

inline 函数:     
     inline 成员函数的定义必须在调用该函数的每个源文件中是可见的。不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一个头文件中。


类声明与类定义:

可以声明一个类而不定义它:EX: class Screen;
这种声明,有时成为前向声明,在程序中,引入了类类型的Screen。 在声明之后,定义之前,类Screen 是一个不完全类型。即已知Scree 是一个类型,但不知道包含哪些成员。

注意:
不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(不是定义) 使用该类型作为形参类型或返回类型的函数。不能定义该类型的对象。


为什么类的定义 以分号结束:
     因为类定义之后可以接一个对象定义列表。


this 指针的使用:
     当需要将一个对象作为整体应用而不是引用对象的一个成员时。 EX: 成员函数返回对调用该函数的对象的应用。 (对this 解引用,返回即可) 返回*this.

从const 成员函数 返回 *this
     在普通的非const 成员函数中, this 的类型是一个指向类类型的const指针
     const 成员函数中 ,  this 的类型是一个指向const 类类型的const指针。 

注意: 不能从const成员函数 返回指向类对象的普通引用。const 成员函数只能返回 *this作为一个const 引用。

回顾: 指向const 对象的指针 或 const 引用对象都不能调用 类里面的非const 成员函数。

基于const 的重载:
     为了解决const 成员函数不能返回 指向类对象普通引用, 定义两个函数:一个是const ,一个是非const。 const 对象只能使用const 成员, 非const 对象可以使用任一成员,但非const版本是一个更好的匹配。


可变数据成员mutable
     希望类的数据成员可以修改(甚至在const 成员函数内) ,这时 就应该声明为mutable
     可变数据成员永远都不能为const。


使用类的成员:
     定义类型的成员, typedef 定义的类型,使用 类名:: (作用域操作符)访问。

形参表和函数体处以类作用域:
     在定义于类外部的成员函数中,形参表和成员函数体都出现在成员名之后,这些都是在类作用域中定义的,所以可以不用限定而引用其他成员
     

函数返回类型 不一定在 类作用域中:
     返回类型出现在成员名字前面。 如果函数在类定义体外定义,而且返回类型使用由类定义的类型,则必须使用完全限定名


类的成员被屏蔽了,可以通过用类名来限定成员名或显示使用this 指针来使用。

全局对象被屏蔽了, 可以通过用全局作用域确定操作符来限定名字  EX:::对象名


隐式类类型转换:

     可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。
   EX:  Sales_item (const std::string &book = ""): isbn(book), units_sold(0), revenue(0.0){}
          string 类型在某种特定的条件下就能隐式转成Sales_item 类型
     
抑制由构造函数定义的隐式转换:
     通过将构造函数声明为 explicit ,防止在需要隐式转换的上下文中使用构造函数。
     注意: explicit 关键之只能用于类内部的构造函数声明上。

为转换而显式使用构造函数:中止了隐式地使用构造函数。
               上面的例子可以 通过  Sales_item(null_book) // null_book 是string 类型  显式转换。



友元friend : 机制允许一个类将对其非公有成员的访问权授予指定的函数或类。
                       友元以关键字friend 开始,只能出现在类定义的内部,可以出现在类中的任何地方。通常,将友元声明放在类定义的开始或结尾。
 
友元可以是: 普通的非成员函数、其他类的成员函数、整个类。
                     使用其他类的成员函数: 函数名必须用该函数所属的类名字加以限定。


友元声明 与 作用域:
       友元声明将已命名的类或非成员函数引入到外围作用域中。此外,友元函数可以在类的内部定义,该函数的作用域扩展到包围该类定义的作用域。
      必须先定义包含成员函数的类,才能将该类的成员函数设为友元


类必须把重载函数集中的每一希望设为友元的函数都声明为友元。



static 类成员:
     每个static 数据成员是预类关联的对象,不与该类的对象相关联。

static 成员函数: 没有this形参, 可以直接访问所属类的static 成员,但不能直接使用非 static 成员。
                          在类外部定义static 成员时,无须重复指定。
                          static成员函数 不能声明为const  ;想下const 的原因就明了
                          static成员函数 不能声明为虚函数。

static 数据成员:必须在类定义体的外部定义(正好一次)。static 成员不是通过类构造函数进行初始化,而是在定义时进行初始化。 static 关键字只能用于类定义体内部的声明中定义不能表示为static

整型 const static 成员:
     初始化式 是一个常量表达式, 整型 const static 数据成员就可以在类的定义体重进行初始化。 同时,该数据成员仍必须在类的定义体之外进行定义。

static 成员 不是类对象的组成部分:
     static 数据成员的类型可以是该成员所属的类类型。 非 static 成员被限定声明为其自身类对象的指针或引用。
     非static 数据成员不能用作默认实参。static 可以。
                        

使用类的static 成员:
     通过作用域操作符 从类直接调用static 成员, 或者通过对象、引用或指向该类类型对象的指针间接调用。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值