VC++(二)掌握C++

  • 结构体默认情况下,其成员是公有的。
  • 类默认情况下,其成员是私有的。
  • 一旦在类内定义了一个构造函数,不论这个函数带不带参数,类都不再提供默认的构造函数。

如果一个类没有定义任何的构造函数,那么编译器只会在以下三种情况,才会提供默认的构造函数。
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类时);
2、如果类有基类的构造函数(可以是用户定义的,也可以是编译器提供的默认构造函数);
3、在类的所有非静态的对象数据成员,他们所属的类中有构造函数(可以是用户定义的,也可以是编译器提供的默认构造函数)
析构函数只能有一个,且不允许带任何参数在函数重载时,要注意函数带有默认参数的情况

父类构造函数、子类构造函数、子类析构函数、父类析构函数

class animal
{
public:
    animal(int height, int weight)
    {
    }
}
class fish
{
public:
    fish()::animal(400, 300)
    {
    }
}fish fh; 先调用父类带两个参数的构造函数,然后调用子类不带参数的构造函数

class point
{
public:
    point()::x(0), y(0) //一种初始化的方式
private:
    int x;
    int y;
}

public 定义的成员可以在任何地方被访问
protected 定义的成员只能在该类及其子类中访问
private 定义的成员只能在该类自身中访问
基类中的private成员不能被派生类访问,因此,private成员不能被派生类所继承

举例说明:
class animal
{
public:
    int publicMember;
protected:
    int protectedMember;
private:
    int privateMember;
}am;

class fish :public animal
{
}fh;

int main()
{
    fh.publicMember = 1; //OK
    fh.protectedMember = 1; //ERROR
    fh.privateMember = 1; //ERROR
    return 0;
}

class fish :private animal
{
}fh;

int main()
{
    fh.publicMember = 1; //OK
    return 0;
}
animal::publicMember”不可访问,因为“fish”使用“protected”从“animal”继承

总结一下:

  • 继承类如果以public方式继承基类,则基类的三个PPP不变,然后子类继承基类。
  • 继承类如果以protected方式继承基类,则基类的public变成protected,protected不变,然后子类继承基类。
  • 继承类如果以private方式继承基类,则基类的public、protected变成private,然后子类继承基类。
  • 总之,是先改变基类的三个PPP,然后才从基类继承。如果三个PPP都转换成了私有,则子类相当于什么也没有继承。因为私有只能在类内访问,不能在类外或者子类里面访问。
    多重继承时,初始化是按照基类列表中的说明顺序进行初始化的。
    虚函数与多态性,纯虚函数。
class animal
{   
public: 
    void eat()  
    {                   
        cout << "animal eat";           
    }
    void sleep()            
    {           
        cout << "animal sleep";                         
    }
            
    virtual void breathe()               
    {           
        cout << "animal breathe";           
    }
}; 
class fish :public animal
{
public:
    void breathe()
    {
        cout << "fish bubble"; 
    }
}           
void fn(animal pAn)
{
    pAn->breathe(); 
}
void main()
{
    animal pAn; 
    fish fh; 
    pAn = &fh; 
    fn(pAn); 
}

基类中void breathe()加virtual 不加virtual的区别

不加virtual时,输出的是animal:
C++编译器将fh进行了类型转换,此时编译器认为pAn保存的就是animal对象的地址。调的当然是animal。
用virtual关键字声明的函数叫做虚函数。
C++的多态性用一句话概括就是:在基类的函数前加virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
也就是说,多态性是按照对象的实际类型来运行的。
纯虚函数:
virtual void breathe() = 0;
含有纯虚函数的类叫做抽象类。
抽象类不能声明对象。
派生类中必须完全实现纯虚函数。否则派生类也是抽象类,不能实例化。
无论该覆盖定义是否有virtual关键字,该函数都是虚函数。

函数的覆盖:

1、基类函数必须是虚函数
2、发生覆盖的两个函数分别位于派生类和基类中
3、函数名称与参数列表必须完全相同

函数的隐藏两种情况:

1、派生类的函数和基类的函数完全相同,只是基类的函数没有virtual
2、派生类的函数与基类的函数同名,但参数列表不一样。不管基类的函数有没有virtual,基类的函数都将被隐藏。重载发生在一个类里面。
列表不一样就隐藏了、没有虚函数的事也隐藏了。
列表一样,有虚函数叫覆盖。
记住:函数覆盖,参数列表一样。
记住一句话:函数的覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数,不属于这种情况的就是隐藏了。
覆盖了就不显示了,隐藏了还可以显示。

引用:

引用就是一个变量的别名
int a = 5;
int &b = a; //引用在声明时必须初始化。
引用一旦初始化,它就代表了一块特定的内存,不能再代表其他的内存。
指针是地址。指针变量要存储地址值,因此要占用存储空间。我们可以随时修改指针变量所保存的地址值,从而指向其他的内存。
设计习惯以及头文件重复包含的问题。
<> 和 "" 的区别。<> 和 "" 表示编译器在搜索头文件时的顺序不同。
<> 表示 系统目录、PATH环境变量列出的目录,不搜索当前目录。
"" 当前目录、系统目录、PATH环境变量列出的目录。

条件预处理指令

#ifndef ANIMAL_H_H
#define ANIMAL_H_H

VC++ 程序编译链接的原理与过程

C++对工程中的三个源文件单独进行编译。编译时,先由预处理器对预处理指令进行处理,在内存中输出翻译单元。编译器接受预处理器的输出。将源代码转换成包含机器语言指令的三个目标文件(obj)。接下来链接器将目标文件和标准类库一起链接生成exe文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 一个博客,这个博客记录了他读这本书的笔记,总结得不错。《深度探索C++对象模型》笔记汇总 1. C++对象模型与内...
    Mr希灵阅读 5,488评论 0 13
  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 1,690评论 4 19
  • 本文转载自:(做了一些改动)http://www.cnblogs.com/feixiang927/p/504856...
    安然_fc00阅读 5,831评论 1 6
  • 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...
    breakfy阅读 2,072评论 0 21
  • C++ 面向对象编程 博客园地址:http://www.cnblogs.com/xiongxuanwen/p/42...
    先之阅读 670评论 0 1