您的位置:首页 > 编程语言 > C语言/C++

c++ primer之类

2015-09-01 22:41 435 查看
类的基本思想是数据抽象封装

数据抽象是一种依赖于接口实现分离的编程(以及设计)技术。类的接口包含用户所能执行的操作,类的实现则包含类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。

封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。

类成员再探

- 类中除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名。由类定义的类型名字和其他成员一样存在访问限制,可以是public或者private中的一种。

例:
class Screen
{
public:
typedef std::string::size_type pos;
// 使用类型别名等价地声明一个类型名字
// 也就是: using pos = std::string::size_type;
Screen() = default;  //因为Screen有另一个构造函数,所以本函数是必需的
Screen(pos ht, pos wd, char c):
height(ht), weight(wd), contents(ht*wd,c){ }
private:
// 类内初始化
pos cursor = 0;
pos height = 0, width = 0;
std::string contents;
};
class Window_mgr
{
private:
std::vector<Screen> screen(Screen(24, 80, ' '));
};


注意,用来定义类型的成员必须先定义后使用,这一点与普通成员有所区别(普通成员,可以在之后声明,因为程序在编译的时候,会先编译声明部分,在编译定义的内容)。

另外,类内初始值是c++11的新特性,必须使用=的初始化形式或者花括号括起来的直接初始化形式。

因为我们已经提供了一个构造函数,所以编译器将不会自动生成默认构造函数。如果我们需要默认构造函数,必须显式地把它表明出来。在此例中我们使用=default告诉编译器为我们合成默认构造函数。其实就是重载构造函数。

可变数据成员

声明可变数据成员,只需要在数据类型前面加 mutable 即可;

class Screen
{
public:
void some_member() const;
private:
mutable size_t  access_ctr; //即使是一个const对象内也能被修改
};

void Sreen::some_member() const
{
++access_ctr;  // 即使是const函数,也可以修改值,因为它声明的是可变数据成员。
}


类类型

每个类定义了唯一的类型,对于两个类来说,即使它们的成员完全一样,这两个类也是两个不同的类型。(不存在两个类相同的情况)

例:
struct First{
int memi;
int getMem();
};
struct Second{
int memi;
int getMem();
};
First obj1;
Second obj2 = obj1;     // 错误:obj1和obj2的类型不同


我们可以把类名作为类型的名字使用,从而直接指向类类型。或者,我们也可以把类名字跟在关键字class或struct后面:

Sales_data item1;               // 默认初始化Sales_data类型的对象
class Sales_data item1;     // 一条等价的声明(从c语言继承而来)


类的声明

就像可以把函数的声明和定义分离开来一样,我们也能仅仅声明类而暂时不定义它:

class Screen; // Screen类的声明

友元的声明

友元的声明(并不代表函数声明)仅仅指定了访问权限,而非一个普通意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。另外为了使友元对类的用户可见,我们通常把友元的声明与类本身放置在同一个文件件中。

例:
struct X
{
// 就算在类的内部定义函数,我们也必须在类的外部提供相应的声明从而是函数可见。
friend void f(){/* 友元函数可以定义在类的内部 */}
X() {f();}   // 错误: f还没有被声明
void g();
void h();
};
void x::g() { return f(); }  // 错误:f还没有被声明
void f();   // 声明那个定义在X中的函数
void X::h() { return f(); }  // 正确:现在f的声明在作用域中了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++primer 类再探