VC++学习(2):掌握C++

C++ 的标准输入输出流

  C++中提供了一套输入输出流类的对象,它们是cin coutcerr,对应c语言中的三个文件指针stdinstdoutstderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。

  cin>>一起完成输入操作,coutcerr<<一起完成输出与标准错误输出。利用cincoutC语言中的scanfprintf要方便得多,cincout可以自动判别输入输出数据类型而自动调整输入输出格式,不必像scanfprintf那样一个个由用户指定。使用cincout不仅方便,而且减少了出错的可能性。对于输出来说,我们像以上方式调用就可以了,对于输入来说,我们以如下方式调用即可:

  int i;

  cin>>i;

注意箭头的方向。在输出中我们还使用endlend of line),表示换行,注意最后一个是字符l,而不是数字1endl相当于C语言的'\n',表示输出一个换行。


与C不同,C++中的结构体可以包含函数;

C++中结构体和类可以通用,不同之处在于访问控制方面:前者默认权限为public,后者默认权限为private。

构造函数

1、构造函数最重要的作用是创建对象本身 。

2C++规定,每个类必须有一个构造函数,没有构造函数,就不能创建任何对象。

3C++又规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供),这个默认的构造函数是一个不带参数的构造函数,它只负责创建对象,而不做任何的初始化工作。

4、只要一个类定义了一个构造函数,不管这个构造函数是否是带参数的构造函数,C++就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

析构函数

1、当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。

2、析构函数是反向的构造函数,析构函数不允许有返回值,更重要的是析构函数不允许带参数,并且一个类中只能有一个析构函数。

3、析构函数的作用正好与构造函数相反,对象超出其作用范围,对应的内存空间被系统收回或被程序用delete删除时,析构函数被调用。

4、根据析构函数的这种特点,我们可以在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。

函数的重载

  重载构成的条件:函数的参数类型、参数个数不同,才能构成函数的重载。

  分析以下两种情况,是否构成函数的重载。

第一种情况:(1void output();

                        2int output();    ——— 不可以

第二种情况:(1void output(int a,int b=5);

                   2void output(int a);  —— 可以

this指针

1this指针是一个隐含的指针,它是指向对象本身,代表了对象的地址

2、一个类所有的对象调用的成员函数都是同一代码段。那么成员函数又是怎么识别属于同一对象的数据成员呢?原来,在对象调用pt.output(10,10)时,成员函数除了接受2

个实参外,还接受到了一个对象s的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&pt。所有对数据成员的访问都隐含地被加上前缀this->。例

如:x=0; 等价于 this->x=0


小技巧:在以后的MFC编程中,如果在成员函数中想调用同类中的某个成员,可以使用VC++提供的自动列出成员函数功能,使用this->VC++将列出该类中的所有成员,我们可以从列表中选择我们想调用的成员。

自动列出成员函数功能,可以提高编写速度,减少拼写错误。我们经常不能完全记住某个函数的完整拼写,但却能够从列表中辨别出该函数,自动列出成员函数的功能在这时就显得更加有用了。事实上,在各种IDE编程环境中,我们通常都不可能记住也没有必要记住所有的函数,只要将常用的函数记住,其他不常用的函数只要记住其大概的写法和功能,在调用该函数时可以从自动列出成员函数中选取,这样可以大大节省我们的学习时间。我们不用花费大量的时间去死记硬背许多函数,利用自动列出成员函数功能和帮助系统,就能够在编程时顺利地使用这些函数,等用的次数多了,也就在不知不觉中完全掌握了这些函数。


类的继承

  

   在C++中,给我们提供了一种重要的机制,就是继承。 理解继承是理解面向对象程序设计的关键。

基类的访问特性

类的继承特性

(继承方式)

子类的访问特性

Public

Protected

Private

Public

Public

Protected

No access

Public

Protected

Private

Protected

Protected

Protected

No access

Public

Protected

Private

Private

Private

Private

No access

函数的覆盖

  函数的覆盖是发生在父类与子类之间的。

类型的转化:




fish对象内存布局:fish对象的this指向animal对象,多态原理

多态性

   当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数(抽象函数),这个时候C++就会采用迟绑定(late binding的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。

引用和指针变量的内存模型

VC++程序编译连接原理与过程


以下是部分资料:

1。定义结构体和类时。例如Class Point{int x;int y;};要注意一定加上分号,结构体定义默认成员是public,而Class定义默认为private

2#include <xxxh>#include "xxxh"的区别:<>不查找运行时目录,""查找运行时目录!(#include<xxx>引入是源文件,要用上using namespace xxx;)

3。类的定义中,如果未指明成员类型,则缺省为private。而结构体中则缺省为public

4。引用:引用经常用在函数的传参上。另外数值交换函数也经常用引用。例

change(int &xint &y){int temp;temp=x;x=y;y=x}调用时即可以用 int a=3;int b=4;change(ab);一般不用指针来作为参数进行数值交换。因为会引起歧义。

5。通常将类的定义放。h文件,而将其实现放在cpp文件中,别忘记了在cpp文件中#include "xxxh"

6。如何防止类的重复定义?

#inndef Point_H_H

#define Point_H_H

class Point{};

#endif来防止

7。源文件cpp文件单独编译成obj文件。最后由链接器将与将要使用到的C++标准库类链接成exe文件,头文件不参加编译。所以在cpp文件中别忘记了加入#include "xxxh"

8。函数的覆盖,在子类中重写父类的函数,此时采用早期绑定的方法。如果加入了virtual,则将采用迟绑定的技术,在运行时根据对象的类型确定调用哪一个函数。此迟绑定技术是MFC的类的继承的精髓。

9。强制类型转换。如果CFishCAnimal派生而来。则可以将鱼的对象转换为CAnimal的对象,而反之则不行。从现实中理解也是正常的,鱼可以是动物,而动物却不是鱼。再如int可以强制转换成char型。而反之则出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值