孙鑫VC++讲座笔记-(2)——掌握C++

本节先从C++C的输入输出的比较来开题,从结构体的演变,即在C++的编程环境下,结构体内也是可以有成员函数,并且缺省状态下结构体内的成员都是Puplic的,相对应的在C++编译环境下,以Class声明的类,在缺省状态下结构体内的成员都是Private的。当然我们的结构体内也可以显示的声明结构的公有和私有关系,所以说在C++中,structClass都可以声明和定义一个类。当然在C编译环境下struct是不可以进行如此操作的。经过我的修改尝试,用struct和用class定义的类,在C++环境中都是可以完成继承等等操作,所以说两者是一样的,理论上可以混用,当然为了严格规范,以后还是对类还是要规范为class开头。

 

类的构造函数,孙鑫为我们规定了以下定义:

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

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

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

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

 

与类的构造函数相对应的是类的析构函数,它有以下定义:

1、当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作就由析构函数来完成。如果我们创建了堆内存,则我们在析构函数内必须delete这个指针变量来释放堆内存。

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

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

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

 

由对象的初始化不同,我们需要多个构造函数,这时孙鑫就为我们引进了函数重载的条件概念——函数的参数类型、参数个数不同,才能构成函数的重载。显然这个概念还是比较抽象的,孙鑫为我们提供以下两个实例:

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

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

           2int output();

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

                2void output(int a);

从程序编译时,编译器是否能够识别函数来看重载是否能够构成,为此,以上两个实例,显然都不能被编译器识别,为此只有返回值类型不同是不能够构成函数重载,在带默认参数的函数中,需要注意能否由我们自己识别,如果不能也是不能构成函数重载的。

 

关于类内的this指针成员,其实类内的this指针是没有意义的,只有我们用这个类来实例化一个对象时,代码中的this指针才有意义即指向对象本身。所以说this指针是一个隐含的指针,它是指向对象本身,代表了对象的首地址。

 

关于继承问题,是一个面向对象的概念,即派生类继承基类的成员,也可以说是子类继承父类的信息。关于继承时候的成员属性的更改,孙鑫给出了以下这个表格,很具体也很有比较意义。

基类的访问特性

类的继承特性

子类的访问特性

Public

Protected

Private

Public

Public

Protected

No access

Public

Protected

Private

Protected

Protected

Protected

No access

Public

Protected

Private

Private

Private

Private

No access

 

对于同样的方法,当父类的方法不能满足子类的需求时,我们必须在子类的同名函数中添加属于子类的操作代码,这个就是类的覆盖

 

类的多态性质,如果基类中的成员函数前加上了virtual关键字,也即声明为该成员函数为虚函数后,编译器在编译的时候则采用迟绑定技术(late binding),程序运行过程中,根据对象的类型来调用父类的成员函数还是子类的同名成员函数。当然没有virtual时,编译时采用早绑定技术。

注:在这里,稍带提到了类型转换方面的知识点,即类型转换时首先要看类型转换前后的两个变量之间在内存上有什么差别,根据内存之间关系来决定是否可以实现转换。当然如果使用强转换,则在编译过程中能通过,但是可能会造成数据的丢失。对象的类型转换时,用于有继承关系的类的实例化对象,由于传递的是对象的指针即对象的首地址,所以是可行的,而且通常用的也比较多。

 

抽象类和纯虚函数,当一个类的虚函数等于零,而没有函数体时,我们就把这个函数称为纯虚函数,相对应的含有纯虚函数的类被称为抽象类。抽象类是不能进行实例化的,以抽象类为基类派生的类如果不对纯虚函数进行重新定义的话,那么派生类也同样是一个抽象类,也是不能进行实例化,也即不能在程序代码中直接拿来用。

 

引用和指针变量。引用其实是相对变量来说的,也就是相当于变量的一个别名或者绰号,所以引用在声明的时候,我们必须让它实例化一个变量,要不然是不能实现引用的定义的。引用并没有分配内存,这是它与指针最大的不同,指针是分配了内存的变量,而这个变量的内存存放的是所指向的变量的地址。

引用经常在传引用的函数参数传递过程中,这样也可以增强程序的可读性。以下是关于引用和指针内存模型的示意。

 

VC++程序编译链接原理与过程,VC是一个编译器也是一个链接器,所以它先执行编译,后链接编译生成的目标文件,生成一个可执行文件。这就是简单的编译链接原理。孙鑫给出了图示结构,在这里我就不贴了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值