最近在看C++的继承与派生机制 愈发感觉有必要复习下前几章的知识--毕竟 大学这么多课 也就对C++有兴趣了..
参考资料:C++语言程序设计 第4版 郑莉
有句话 很经典---万事万物皆对象-object
面向对象程序设计的4大特点:1.抽象 2.封装 3.继承 4.多态
抽象 分为 数据抽象 和 行为抽象
封装 就是一种安全的措施 将自己不想让别人看到的东西“隐藏"起来 通常用private来实现 来达到对成员访问权限的合理控制
继承 就是使代码更具 层次感 你所要实现的功能 如果已经有上层实现了 那就直接继承它吧
多态 一段程序能够处理多种类型对象的能力--强制多态 重载多态 类型参数化多态 包含多态
上面所讲的是 一个整体的框架 我们需要做的是 深入去了解 就如 你邂逅一个姑娘 你被她吸引 你想在她身上探索更多 那就要深入 深入 。。。。。
PS:我所讲的 可能会毫无 逻辑感 本就是 自娱自乐 .....
数据类型 = 基本数据类型 + 自定义数据类型 每一种数据类型都是对一类数据的抽象 每一个变量都是其所对应的数据类型的一个实例
如果 没看过这本书 我肯定一直 以为 int i 声明了一个int型的变量 变量名是i 其实它还蕴含了很多秘密
它限定了我们对变量的操作 每一种 数据类型 都包括了数据本身的属性和对数据的操作
类 -数据成员 和 函数成员 组成
class 类名称
{
public:
外部接口
protect:
保护型成员
private
私有成员
}
类成员的访问控制----
private: 只能被本类的成员函数访问 来自类外部的访问都是非法的
protect: 与private的区别 在于继承实现方式的不同对子类访问的不同影响
public: 可以被类外部访问
假设 有个类:
class A{}; A a 则 A--类的名字 a--对象名字
这里 想到个很有意思的一段代码:
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 7 }; 8 9 int main() 10 { 11 printf( "%d " , sizeof(A) ); 12 getchar(); 13 return 0; 14 }
我也懒得卖关子了 就直接给出答案了: 1
至于原因 就直接拿出性神和龙龙贴过的解释:
类的实例化是在内存中分配一块地址 每个实例在内存中都有一块独一无二的地址 同样 空类也会被实例化 所以编译器会给它隐含地添加一个字节 这样空类实例化就有独一无二的地址了 所以 空类的sizeof 答案是1 而不是 0 (在这里 感谢 性神 给出那么 权威的 解释)
C++ 很多的小细节 真的 很耐人寻味 。。。
访问数据成员: 对象名.数据成员名
调用函数成员: 对象名.函数成员名( 参数表 )
接下来讲个 以前学C的时候 没接触过的一种函数-----内联成员函数-------隐式声明 显示声明---------
使用 内联函数----该函数 可能会被 频繁调用 且代码简单 不能含循环 它是在编译过程中 插入到 每一个 调用它的地方
利弊: 减少调用的开销 提高执行效率 增加代码长度
隐式声明: 函数体直接放在类体之中
1 class A 2 { 3 public: 4 void say() 5 { 6 printf( "no meaning" ); 7 } 8 };
当然 可以say 函数的返回值 前面 加上 inline 我也建议这样 更能使 代码具有可读性
显示声明: 类中 仅是声明了这个函数
1 class A 2 { 3 public: 4 void say(); 5 }; 6 7 inline void A::say() 8 { 9 printf( "girl girl "); 10 }
下面所要提到的 也感觉是最为关键的 构造函数 析构函数
构造函数---主要功能 实现初始化--( 在定义对象的时候进行的数据成员设置 ) 将对象初始化为 一个特定的状态
构造函数 虽然也是成员函数 但它是很特殊的: 函数名与类名相同 无返回值
基本类型变量的初始化过程: // 累了 晚上 再写下去 感觉写的太基础了 没有自己看的时候 那种深度.....