好久以前就注册了一个CSDN的账号,但一直没有静下心来写一篇博客,当然,也一直觉得可能没那个水准。今天借来了一部电脑来总结一下C++,第一篇博客,不知道从何写起,还是从C++最基础的特性:继承与多态说起。
C++是强类型语言,任何变量都有类型,程序在编译时会做类型检查。C++的最强大之处就是指针,它使程序员能够相当自由使用存储空间,同时,这也是C++编写的难点,C++中没有像JAVA一样的内存垃圾回收机制,程序员需要自己负责存储空间的释放(在什么地方释放往往是一个难点,常常出现new与delete不成对出现的情形)。
继承:子类按一定权限获取父类的属性以及操作这些属性的方法(操作)
父类与子类有是一般与特殊的关系。
有个问题是大家争论不休的:子类到底有没有获得(继承)父类的私有属性(public继承的时候)?父类的私有属性会不会影响子类的sizeof值?
我一直认为是获得了的,父类会获得子类的全部数据成员。但为什么获得了又不能访问呢?C++语言从另一方面限制了子类对私有属性的的访问,可见性,父类的私有属性在子类对象中是不可见的。你可以把它想象成拥有一种比private更苛刻的访问的权限,而类对象方法最多只能够访问到private权限属性。
另外,子类不能继承父类的构造方法,析构方法和赋值运算符。
复制构造函数和赋值构造函数有何区别?
复制构造函数只有在操作涉及到内存分配的时候才会触发系统调用,即:一个对象B用“=”运算符给另外一个对象赋值A时:
1、如果A在之前已经申明定义(拥有了存储空间),那么这时触发的是赋值构造函数;
2、如果A的声明定义和“=”操作是同一个语句,那么这时触发的是复制构造函数。
也是就说复制构造函数有两个功能:
1、给对象一块存储空间;
2、改变存储空间的的值(赋值构造函数的功能)
多态: 面向对象语言的一大特性,以损失部分执行效率为代价来实现程序在执行期动态改变指针的入口函数
它是很多设计模式显示的基础,个人认为也是与过程化设计语言(例:C)最主要的区别。我在这里只描述一个很小的细节。
当确定一个类会作为基类使用时,我们应该习惯性的把它的析构函数设置为虚函数,或许,平常我们没设置时也没出错,但一旦出现这样的错误,是很难发现的,它是运行期的错误。
例如:类B继承于类A,当类B中有成员指针(假设为p)动态申请存储空间时,而且是用类A的指针(假设为p_a)指向类B的对象,当p_a的生存期结束时,系统只会调用class A的析构函数,类B的析构函数没有被调用,这就导致p所指存储空间没有释放(我们通常会在class B 的析构函数中执行delete p语句),导致错误,而且错误可能是无法预知的。
篇后感
第一次写博客,过程断断续续的,让别人知道比自己知道要困难好多。错误的地方望大家指正!