您的位置:首页 > 编程语言 > C语言/C++

初学C++的一些不清楚的坑

2018-03-01 23:15 134 查看
1.左值与右值。
2.指针的一些应用。
3.关于内存安全问题(析构函数)。

4.虚函数。
——>虚函数的作用是解决子类与父类相同原型成员函数的函数调用问题·
举个例子
多态中存在的问题[-:>内存泄漏,一个很严重的问题例如上面的程序中,如果在圆形的类中定义一个圆心的坐标,并且坐标是在堆中申请的内存,则在mian函数中通过父类指针操作子类对象的成员函数的时候是没有问题的,可是在销毁对象内存的时候则只是执行了父类的析构函数,子类的析构函数却没有执行,这会导致内存泄漏。部分代码如下(想去借助父类指针去销毁子类对象的时候去不能去销毁子类对象)如果delete后边跟父类的指针则只会执行父类的析构函数,如果delete后面跟的是子类的指针,那么它即会执行子类的析构函数,也会执行父类的析构函数

class Circle:public Shape
{
public:
Circle(int x,int y,double r);
~Circle();
virtual double calcArea();
....
private:
double m_dR;
Coordinate *m_pCenter;      //坐标类指针
....
};
Circle::Circle(int x,int y,double r)
{
m_pCenter=new Coordinate(x,y);
m_dR=r;
}
Circle::~Circle()
{
delete m_pCenter;
m_pCenter-NULL;
}
....
int main()
{
Shape *shape1=new Circle(3,5,4.0);
shape1->calcArea();
delete shape1;
shape1=NULL;
return 0;
}

可见我们必须要去解决这个问题,不解决这个问题当使用的时候都会造成内存泄漏。面对这种情况则需要引入虚析构函数虚析构函数关键字 virtual ->析构函数之前是使用virtual去修饰成员函数,这里使用virtual去修饰析构函数,部分代码如下
1 class Shape
2 {
3 public:
4     ....
5     virtual ~Shape();
6 private:
7     ....
8 };
9 class Circle:public Shape
10 {
11 public:
12     virtual ~Circle();//与虚函数相同,此处virtual可以不写,系统将会自动添加,建议写上
13     ....
14 };
15 ....

这样父类指针指向的是哪个对象,哪个对象的构造函数就会先执行,然后执行父类的构造函数。销毁的时候子类的析构函数也会执行。
virtual在函数中的使用限制
普通函数不能是虚函数,也就是说这个函数必须是某一个类的成员函数,不可以是一个全局函数,否则会导致编译错误。
静态成员函数不能是虚函数 static成员函数是和类同生共处的,他不属于任何对象,使用virtual也将导致错误。
内联函数不能是虚函数 如果修饰内联函数 如果内联函数被virtual修饰,计算机会忽略inline使它变成存粹的虚函数。
构造函数不能是虚函数,否则会出现编译错误。

5.C++迭代器

6.C++里的一些排序算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: