初学C++的一些不清楚的坑
2018-03-01 23:15
134 查看
1.左值与右值。
2.指针的一些应用。
3.关于内存安全问题(析构函数)。
4.虚函数。
——>虚函数的作用是解决子类与父类相同原型成员函数的函数调用问题·
举个例子
多态中存在的问题[-:>内存泄漏,一个很严重的问题例如上面的程序中,如果在圆形的类中定义一个圆心的坐标,并且坐标是在堆中申请的内存,则在mian函数中通过父类指针操作子类对象的成员函数的时候是没有问题的,可是在销毁对象内存的时候则只是执行了父类的析构函数,子类的析构函数却没有执行,这会导致内存泄漏。部分代码如下(想去借助父类指针去销毁子类对象的时候去不能去销毁子类对象)如果delete后边跟父类的指针则只会执行父类的析构函数,如果delete后面跟的是子类的指针,那么它即会执行子类的析构函数,也会执行父类的析构函数
可见我们必须要去解决这个问题,不解决这个问题当使用的时候都会造成内存泄漏。面对这种情况则需要引入虚析构函数虚析构函数关键字 virtual ->析构函数之前是使用virtual去修饰成员函数,这里使用virtual去修饰析构函数,部分代码如下
这样父类指针指向的是哪个对象,哪个对象的构造函数就会先执行,然后执行父类的构造函数。销毁的时候子类的析构函数也会执行。
virtual在函数中的使用限制
普通函数不能是虚函数,也就是说这个函数必须是某一个类的成员函数,不可以是一个全局函数,否则会导致编译错误。
静态成员函数不能是虚函数 static成员函数是和类同生共处的,他不属于任何对象,使用virtual也将导致错误。
内联函数不能是虚函数 如果修饰内联函数 如果内联函数被virtual修饰,计算机会忽略inline使它变成存粹的虚函数。
构造函数不能是虚函数,否则会出现编译错误。
5.C++迭代器
6.C++里的一些排序算法
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++里的一些排序算法
相关文章推荐
- 初学c++的一些小记录(Mac下)
- 刚才在论坛上看到的一些学习C++的东东,可能对初学有点用
- 初学C++的一些困惑
- 在csdn论坛上一些csdn网友对初学C++的菜鸟们的一些建议
- C++中的一些小知识
- C++中指针详解(一些困惑的回答)
- C++一些注意点之operator new 和new operator
- c++的虚拟继承 的一些思考吧
- 初学ios开发,关于自定义界面有一些疑问
- 浅谈C\C++代码优化中的一些小技巧
- [C++]高效使用c++11的一些建议
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习4
- C++一些重要概念(转)
- 写给初学C++的人
- C++ 一些基本概念
- C++ 何时使用引用参数(一些指导原则)
- C#调用C++一些技巧
- C++ 一些常用的函数以及头文件(一)
- C#与C++交互的一些基础
- [书摘]c/c++中的一些算法