c++ primer之类
2015-09-01 22:41
435 查看
类的基本思想是数据抽象和封装。
数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术。类的接口包含用户所能执行的操作,类的实现则包含类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。
类成员再探:
- 类中除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名。由类定义的类型名字和其他成员一样存在访问限制,可以是public或者private中的一种。
注意,用来定义类型的成员必须先定义后使用,这一点与普通成员有所区别(普通成员,可以在之后声明,因为程序在编译的时候,会先编译声明部分,在编译定义的内容)。
另外,类内初始值是c++11的新特性,必须使用=的初始化形式或者花括号括起来的直接初始化形式。
因为我们已经提供了一个构造函数,所以编译器将不会自动生成默认构造函数。如果我们需要默认构造函数,必须显式地把它表明出来。在此例中我们使用=default告诉编译器为我们合成默认构造函数。其实就是重载构造函数。
可变数据成员
声明可变数据成员,只需要在数据类型前面加 mutable 即可;
类类型
每个类定义了唯一的类型,对于两个类来说,即使它们的成员完全一样,这两个类也是两个不同的类型。(不存在两个类相同的情况)
我们可以把类名作为类型的名字使用,从而直接指向类类型。或者,我们也可以把类名字跟在关键字class或struct后面:
类的声明
就像可以把函数的声明和定义分离开来一样,我们也能仅仅声明类而暂时不定义它:
class Screen; // Screen类的声明
友元的声明
友元的声明(并不代表函数声明)仅仅指定了访问权限,而非一个普通意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。另外为了使友元对类的用户可见,我们通常把友元的声明与类本身放置在同一个文件件中。
数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术。类的接口包含用户所能执行的操作,类的实现则包含类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。
类成员再探:
- 类中除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名。由类定义的类型名字和其他成员一样存在访问限制,可以是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的声明在作用域中了
相关文章推荐
- 一个简单的asp数据库操作类
- C#实现用于操作wav声音文件的类实例
- 在线管理数据库 类
- Lua面向对象之类和继承浅析
- Lua中类的实现原理探讨(Lua中实现类的方法)
- Lua中的类编程代码实例
- C#常用目录文件操作类实例
- c# 类和成员的修饰详细介绍
- C#中实现判断某个类是否实现了某个接口
- C#类的创建与初始化实例解析
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中类与结构的区别实例分析
- C#实现读写ini文件类实例
- C#自定义的字符串操作增强类实例
- C#自定读取配置文件类实例
- C++Primer笔记之关联容器的使用详解
- C++实现不能被继承的类实例分析
- C++实现简单的职工信息管理系统