《c++primer》 第7章 类

本文深入探讨C++中类的概念,包括抽象数据类型定义、访问控制与封装、构造函数特性、静态成员变量及初始化顺序等内容。介绍了如何利用C++特性进行有效的数据封装和对象管理。

7.1定义抽象数据类型

    1.类的基本思想是数据抽象和封装。封装实现了类的接口和实现的分离。

    2.定义在类内部的函数是隐式的inline函数。

    3.const成员函数,也叫常量成员函数。const的作用是修改隐式this指针类型。

string isbn() const {return this->book;}

    默认情况下,this的类型是指向类类型非常量版本的常量指针。不能把this绑定在常量对象身上。加上const,表示this是一个指向常量的指针。常量对象和常量对象的引用或指针只能调用常量成员函数。

    4.构造函数。构造函数不能被声明为const的。只有当类没有声明任何构造函数时,编译器才会自动的生成默认构造函数。当定义了其他构造函数时,必须定义一个默认构造函数。

Sales_data() = default;//默认构造函数(c++11)

7.2访问控制和封装

    1.访问说明符:public,private.

    2.class和struct唯一区别是默认访问权限。struct第一个访问说明符之前的成员是puiblic,而class是private。

    3.友元声明仅仅指定访问权限,而非函数声明。

    4.可变数据成员:声明中加入mutable关键字。一个可变成员永远不会是const,即使它是const对象的成员。

    5.一个const成员函数如果是以引用的形式返回*this,那么它的返回类型将是常量引用。

    6.前向声明:仅声明类而暂时不定义它。声明之后定义之前是一个不完全类型。可以定义指向它的指针或引用,也可以声明(不能定义)以它作为的参数或返回类型的函数。

    7.友元类的成员函数可以访问此类包括非公有成员在内的所有成员。

7.5构造函数再探

    1.如果成员是const,引用,或者属于某种未提供默认构造函数的类类型,必须通过构造函数初始值列表为这些成员提供初始值。成元的初始化顺序与他们在类中定义的顺序一致。
class ConstRef
{
public:
    ConstRef(int ii);
private:
    int i;
    const int ci;
    int &ri;
}
ConstRef::ConstRef(int ii):i(ii), ci(ii), ri(i) { }

    2.一个构造函数的所有参数都提供了默认实参,它实际定义了默认构造函数。

    3.委托构造函数(c++11)。

    4.抑制构造函数的隐式转换。将构造函数声明为explicit加以阻止。explicit只对一个实参的构造函数有效,并且只能在类内声明构造函数时使用。但是可以通过强制转换使用这些构造函数。

    5.字面值常量类:数据成员都是字面值类型的聚合类。

        数据成员必须都是字面值类型。

        类必须含有一个constexpr构造函数。

        如果一个数据成员含有类内值,则内置类型成员的初始值必须是一条常量表达式。如果成员属于某种类类型,则初始值必须使用自己的constexpr构造函数。

        类必须使用析构函数的默认定义。

7.6类的静态成员

    1.静态数据成员的类型可以是常量,引用,指针,类类型等。

    2.类的静态成员存在于任何对象之外。静态成员函数不能声明为const的,不能再静态成员函数体内使用this指针。

    3.static只能出现在类内部的声明语句。外部定义不需要加。

    4.一般在类的外部定义和初始化静态成员。在类内定义时,要求静态成员必须是字面值常量类型的constexpr。

    5.与普通成员不同,静态数据成员可以是不完全类型(可以是它所属的类型)。静态成员可以作为默认实参。


 C++变量的初始化方式



首先把需要初始化的成员变量分为几类:
Ø  一般变量(int)
Ø  静态成员变量(static int)
Ø  常量(const int )
Ø  静态常量(static const int)


 对应的初始化方式是:

Ÿ  一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者类外初始化

Ÿ  静态成员变量必须在类外初始化

Ÿ  常量必须在初始化列表里初始化

Ÿ  静态常量必须只能在定义的时候初始化(定义时直接初始化)

class Test   
{   
private:   
    int a;   
    static int b;   
    const int c;   
    static const int d=4;   
public:   
    Test():c(3)     //a(1)或者在初始化列表里初始化   
    {   
        a=1;   
    }   
};   
int Test::b=2;  
void main()   
{   
    Test t;   
}  

2. 类成员变量初始化顺序

C++

有如下几条:

1构造函数初始化列表的变量优先于构造函数(至少明显的写在前面)  (若都在初始化列表中初始化,则按声明顺序初始化,与初始化列表中的顺序无关)

2静态成员变量先于实例变量

3父类成员变量先于子类成员变量

4父类构造函数先于子类构造函数








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值