目录
5.C++中的空类,编译器默认会提供哪些缺省的成员函数,并将函数写出来。
7.继承情况下,并且父类中有成员对象时。创建子类对象,调用构造函数和析构的顺序是什么样的?
1.函数重载 函数覆盖什么区别?
函数重载:同一作用域(类),同名函数,参数顺序、个数、类型不同都可以重载。函数的返回值类型不能作为重载条件。
函数覆盖: 有继承,子类重写父类的虚函数。返回值类型、函数名、参数顺序、个数、类型都必须一致。
2.类的公有成员和私有成员有什么区别?
public: 在本类中可以访问 在子类中可以访问 全局可以访问
private: 在本类中可以访问 在子类中不可以访问 全局不可以访问
3.什么是多态,多态达成条件是什么?结合代码进行表达。
多态:
一个接口多种状态,调用一个函数,根据传入对象的不同,来执行相应对象的方法。
三个条件:(公鸡孵蛋,真变态)
1.公有继承
2.基类指针指向派生类
3.子类覆盖基类虚函数
#include <iostream>
using namespace std;
class Animal{
public:
virtual void eat(){
cout<<"吃东西"<<endl;
}
};
class Cat:public Animal{
public:
void eat(){
cout<<"吃猫粮"<<endl;
}
};
class Dog:public Animal{
public:
void eat(){
cout<<"吃狗粮"<<endl;
}
};
class Panda:public Animal{
public:
void eat(){
cout<<"吃竹子"<<endl;
}
};
void AnimalEat(Animal& a){
a.eat();
}
int main(){
Cat c;
AnimalEat(c);
Dog d;
AnimalEat(d);
Panda p;
AnimalEat(p);
}
运行结果:
4.抽象类有什么用?如何实现,结合代码解释
抽象类
只是一个抽象的概念,给派生类提供一个框架作用。
只通过虚函数来实现。
#include <iostream>
using namespace std;
class Shape{
public:
virtual void S() = 0;
virtual void C() = 0;
};
class yuan:public Shape{
public:
virtual void S(){
cout<<"圆的面积"<<endl;
}
virtual void C(){
cout<<"圆的周长"<<endl;
}
};
int main(){
yuan y;
y.C();
y.S();
}
运行结果:
5.C++中的空类,编译器默认会提供哪些缺省的成员函数,并将函数写出来。
Person类 :有构造、析构、拷贝、赋值运算符
class Person{
Person();
~Person();
Person(const Person& p);
Person& operator = (const Person& p);
};
6.解释拷贝构造函数中的深拷贝和浅拷贝
浅拷贝:
如果在类中没有显示地声明一个拷贝构造函数,那么编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的值的赋值。
深拷贝:
类内成员变量需要动态开辟堆内存,如果实行浅拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中那个成员变量也指向同一块内存。这就出现了问题,两个对象的指针指向同一块内存地址,当B把内存释放了(如:析构),A再释放时,空间已被释放,所有会出现错误。
7.继承情况下,并且父类中有成员对象时。创建子类对象,调用构造函数和析构的顺序是什么样的?
(成父成子)
- 父类的成员对象
- 父类的构造函数
- 子类的构造函数
- 子类的析构函数
- 父类的析构函数
- 父类的成员对象销毁了