C++学习笔记

之前学C++时,觉得相关的内容都很多很杂,最近刚好复习这块,整理一下之前遇到的几个问题:
1、重载
2、C++中的string
3、this指针
4、对齐
5、C++多态实现机理
6、友元
7、C++的静态变量、静态函数和静态方法

接下来,详细分析:
1、C++中的重载和覆盖是面试中常被问到的,其实现方法不再赘述,这里主要说一下,重载中为什么不考虑返回值类型:
实际上,从重载机制上看,是可以实现返回值不同函数重载的,因为编译之后,重载函数的名字映射为“返回类型+函数名+参数列表”这种类型,所以一个函数的返回值对其变名是有影响的,但是为了保持解析操作符或函数调用时,独立于上下文,所以重载函数不考虑返回值类型。

2、string是C++的自带类,可以用来声明一个字符串,用法是在头文件中加#include,其相关的常用的操作有:
获取字符串长度:str.length(),字符串连接:str=str1+str2,字符串比较,获取第一个字符:str.begin(),倒置串:reverse(str.begin(), str.end()),查找串等等。

3、this指针的应用场景:
考虑如下的代码:
class A
{
char a;
A (char a);
};
A::A(char a)
{
a=a;
}
其中,a=a,想要表达是类中的a,赋值为参数a,但是,语句a=a表达混乱,并不清楚哪个a,是哪个a。所以可以改写成,this->a=a。this->a,表示所属类的a。所以,this指针的应用场景可以总结为:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,就可以用this。

4、字节对齐,结构体内存分配规则:
a、分配内存的顺序是按照声明的顺序。b、每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍,不是整数倍空出内存,直到偏移量是整数倍为止。c、最后整个结构体的大小必须是里面变量类型最大值的整数倍。

5、C++多态实现机理:
编译器在编译的时候,发现基类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表,该表是一个一维数组,在这个数组中存放每个虚函数的地址,编译器另外还为每个对象提供了一个虚表指针,这个指针指向了对象所属类的虚表,在程序运行时,根据对象的类型去初始化虚表指针,从而让虚表指针正确的指向了所属类的虚表,从而在调用虚函数的时候,能够找到正确的函数。
  虚表的创建和虚表指针的初始化是在构造函数中进行,在构造子类对象时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否还有继承者,它初始化父类对象的虚表指针,该虚表指针指向父类的虚表,当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。

6、友元:
类的成员分公有成员、私有成员、保护成员,其区别是:
公有成员:任何情况下可被访问,可被派生类继承。
保护成员:只能在类的内部以及其子类的内部被访问,可被派生类继承。
私有成员:只能在类的内部访问它,其子类也不能够访问,不可被派生类继承。
在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员、保护成员。与函数相同,我们也可以将类B定义为类A的友元类,则类B中所有的成员函数都可以访问类A的私有成员、保护成员。

7、C++中类的静态成员变量、静态成员函数和静态方法:
静态成员变量的定义:类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。
静态变量的特点:
a、和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则;
b、静态成员变量的定义(初始化)不应该被放在头文件中,其定义方式与全局变量相同;
c、.静态成员变量被类的所有对象所共享,包括该类派生类的对象,即派生类对象与基类对象共享基类的静态数据成员;
d、静态成员变量可以成为函数成员的可选参数,而普通数据成员则不可以;
e、静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以,普通数据成员的只能声明为所属类类型的 指针或引用;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
静态成员函数:静态函数是公共的,调用类中的静态函数,你不需要创建对象就可以调用,静态成员函数不可以调用类的非静态成员,因为静态成员函数不含this指针。
特别的,静态成员函数不能定义为虚函数,因为:静态成员函数属于类,在内存中只有一份。而虚函数在实现多态性时,必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以的。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页