1.
构造函数:当没有写任何构造函数(含拷贝构造),系统会生成默认的无参构造,并且访问属性是共有。
默认拷贝构造:当没有写任何的拷贝构造,系统会生成默认的拷贝构造->是一个浅拷贝
写了拷贝构造函数,这两默认的就都没有了。
在c++中一个类可以有多个构造函数,被称为构造函数的重载。但是析构函数只能有一个。
2.
new delete maloc free的区别
new delete:调用对象的构造和析构初始化对象和清理对象。是安全的它们知道要分配和释放的对象类型。
malloc free:用于分配和释放内存块,而不是对象,是不安全的,返回void*,需要显式类型转换。
3.
常量指针指向一个常量数据,通过这个指针不能修改所指向的数据内容。
const int* p1;
int a=10;
const int b=20;
p1=&a;合法
*p1=30;不合法
p1=&b;合法
指针常量,指针常量本身是一个常量,这意味着一旦初始化后,指针的地址不能再改变,但是通过这个指针可以修改它所指向的内容。
int* const p2;
int a=10;
int b=20;
int* const p2=&a;//p2必须在定义时初始化
*p2=30;合法
p2=&b;不合法
const int c=33;
int* const p3=&c;//不合法
4.
static修饰成员属性:不依赖对象,类共用的,不可以被继承,类外初始化,不能在.h文件初始化(重定义问题),要在.cpp 文件初始化。
static 修饰成员函数:没有this指针,可以不依赖对象使用,类共用的,不可以声明为虚函数,不能直接调用类中的非静态成员,可以利用对象调用。
普通成员函数不但可以直接调用其他的普通成员函数,也可直接使用静态成员函数。
反过来不行,没this指针。
static类外:只在当前文件中可见。只初始化一次。
5.
virtual修饰虚函数,实现动态多态,哪些函数不能用virtual修饰,static,构造,友元,普通,类外,内联(编译确定展开,虚函数运行时确认)
子类重写父类的方法时,如果父类的方法是虚函数,那么子类的方法即使不显示地使用virtual,也是虚函数。
虚函数重写函数原型不用一模一样,例如协变:如果返回类型是指针或引用,重写函数可以使用基类返回类型的派生类,这称为协变返回类型。
virtual Base* clone() const{return new Base(*this);}
Derived* clone() const override{return new Derived(*this);}
6.
inline内联函数:适用于代码少,调用频繁的函数,编译时,在执行的位置直接展开函数,是空间来换时间的操作。递归函数不能是内联函数,会导致代码膨胀,使得程序的可读性和可维护性大大降低,栈溢出。
7.
多态时使用的是父类的虚函数列表错:多态性是基于派生类的虚函数表来实现的。当通过基类指针或引用调用虚函数时,实际调用的是派生类的虚函数表中的函数。
多态下子类定义了未重写的虚函数,由于不能通过父类指针调用,所以其并未出现在虚函数列表中。错即使子类定义了一个新的虚函数,而没有在基类中声明,该虚函数仍然会出现在子类的虚函数表中。通过父类指针无法调用的原因是父类中没有定义这个虚函数,而不是因为它不存在于虚函数表中。
8.
一个类对象可以包含虚函数列表的入口地址,不能包括静态成员属性,因为静态成员属性是类的属性,不是对象的属性,成员函数定义的变量是局部变量,类中虚函数成员函数的入口地址存在类的虚函数表中,而不是对象本身。
9.
c++中最小的编译单元是单个 .cpp 文件。
10.
使用 new 操作符,可以动态分配全局堆中的内存资源。
一些情况下可以用free释放new,但是不推荐。
用 new 申请的空间,即使不调用 delete 释放空间,当程序退出时也会被回收,在大多数操作系统中,当程序退出时,操作系统会自动回收程序占用的内存资源,包括由 new 运算符动态分配的内存空间。依赖程序退出时的内存回收会使得程序的资源管理不确定。在程序执行过程中,如果动态分配了大量内存而没有及时释放,可能会导致系统资源的浪费,甚至是内存泄漏。
11.
函数重载的特点:相同函数名,不同参数列表,返回类型不影响函数重载,一个类中定义了两个同名且参数列表也相同的函数,但其中一个是常成员函数也是函数重载,一个类中定义了两个同名且参数列表也相同的函数,但其中一个是静态成员函数。这不是函数重载,静态成员函数属于类本身,而非某个特定的对象实例。