在C语言中,结构体不能包含函数,在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现,C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为

在C++中,结构体可以包含函数,如 p.output(); 结构体是用关键字struct声明的类 

与类的不同之处:  结构体默认情况下,其成员是公有的(public)的;类在默认情况下,其成员是私有的(private)

在C++中预定义了三个标准输入输出流对象:

  • cin(标准输入) 与输入操作符>> 一起用于从标准输入读入数据
  • cout(标准输出) 与输出操作符<&lt;一起用于输出数据到标准输出上
  • cerr(标准错误输出) 与输出操作符&lt;&lt;一起用于输出错误信息到标准错误上

cin和cout可以自动根据数据的类型调整输入输出的格式

 

 

类和对象

类描述了一类事物,以及事物所应具有的属性

C++规定构造函数的名字和类名相同,且没有返回值

构造函数的作用:

对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式

知识点:

  • 如果一个类中没有定义任何的构造函数,那么C++编译器会在某些情况下会为该类提供一个默认的构造函数,是一个不带参数的构造函数
  • 只要一个类中定义了一个构造函数,不管这个构造函数是否带参数,C++编译器就不再提供默认的构造函数,如果想要无参数的构造函数,必须自己定

 

析构函数

当一个对象的生命周期结束时,应该去释放这个对象所占用的资源 定义为~类名()

是一个"反向”的构造函数,不允许有返回值,不允许带参数,并且一个类中只能一个析构函数

作用:

用于清除类的对象

在程序中用delete删除对象时,析构函数自动被调用

对一个对象来说,最后一个被调用的成员函数就是析构函数

 

 

知识点:

在类中定义成员变量时,不能直接给成员变量赋初值

 

函数的重载 overload

多个构造函数的函数名是一样的,只是参数的类型和个数不一样,要注意重载构成的条件:参数的类型和参数个数的不同

  • 只有函数的返回类型不同是不能构成函数的重载的
  • 在函数重载时,要注意函数带有默认参数的这种情况
  • 重载发生在同一个类中

this 指针

this指针是一个隐含的指针,它是指向对象本身的,代表了对象的地址 如 this = &pt;

 

类的继承

在构造对象时,父类的构造函数也要被调用,没有父亲就没有孩子,在析构时正好相反

 

类的继承及类中成员的访问特性

  • public定义的成员可以在任何地方被访问
  • protected定义的成员只能在该类和子类中访问
  • private定义的成员只能在该类自身中访问

 

注意:

  •  如果在定义派生类时没有指定如何继承访问权限,则默认为privte,则基类中的成员在派生类中都变成了private类型的访问类型
  • 基类中的private成员不能被派生类访问,因此,private成员不能被派生类所继承

多重继承

一个类可以从多个基类中派生 语法: class 派生类名: 访问权限 基类名称,访问权限 基类名称…

{

……

};

基类的说明顺序一般没有重要的意义,除非在某些情况下要调用构造函数和析构函数时

  • 由构造函数引起的初始化发生的顺序
  • 激活析构函数以做清除工作的顺序

 

虚函数与多态性

用virtual关键字申明的函数叫做虚函数,C++编译器会采用迟绑定(late binding)技术,编译时并不确定具体调用的函数,而是在运行时,依据对象的类型来确认调用的是哪一个函数 ===>多态性

没有在函数前加virtual关键字时,C++编译器在编译时就确定了哪个函数被调用,叫早绑定(early binding)

 

纯虚函数

是指被标明为不具体实现的虚成员函数,也可以有函数体

凡是含有纯虚函数的类叫做抽象类,这种类不能声明对象 只是作为基类为派生类服务,在派生类中必须完全实现基类的纯虚函数,否则,派生类也变成了抽象类,不能被实例化对象

注:

  • 纯虚函数多用在一些方法行为的设计上
  • C++的多态性是由虚函数来实现的,而不是纯虚函数
  • 在子类中如果有对基函数进行覆盖定义时,无论该覆盖定义是否有virtual关键字,都是虚函数

 

函数的覆盖和隐藏

覆盖override:无论函数名,参数列表都是一样的

构成函数覆盖的条件为:

  • 基类函数必须是虚函数
  • 发生覆盖的两个函数要分别位派生类和基类中
  • 函数名称和参数列表必须完全相同

 

函数的隐藏

派生类中的函数具有与基类同名的函数(不考虑参数列表是否相同)

当隐藏发生时,可以用 基类名::函数名(参数)的语法形式来调用基类中的被隐藏函数

 

引用

引用就是一个变量的别名,它需要另外一个变量或对象来初始化自身

引用和用来初始化引用的变量指向的是同一块内存

引用与指针的区别

引用只是一个别名,引用的地址没有任何意义,是它所引用的变量或者对象的地址

指针是地址,指针变量要存储地址值,因为要占用存储空间

引用一旦初始化,它就代表一块特定的内存,再也不能代表其他内存

可以随时修改指针变量所保存的地址值,从而指向其他内存

#define定义一个宏,需加上判断这个宏是否存在,以此来避免类重复定义

 

#ifndef …

#define …

#endiff

 

VC++编译过程的原理和过程

先由预处理器对预处理指令进行处理,在内存中输出翻译单元(临时文件)

将源代码转换为机器语言指令的目标文件(obj),头文件不参与编译

接下来是链接过程(Linking….)链接器将目标文件和所用到的C++类库文件一起链接生成exe文件