
C++学习
Cogeaaa
我太懒了,真的什么也没有留下。。。。。。。。
展开
-
operator= 要注意避免内存泄露(项目经验)
指针不论是指向malloc还是new分配得到的内存,一定要注意在改变指针指向之前一定要先释放旧的内存块。class Test{public: Test() { if (p != NULL)原创 2015-07-08 17:14:40 · 498 阅读 · 0 评论 -
构造函数为什么不能是虚函数
从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那转载 2015-07-13 18:29:52 · 444 阅读 · 0 评论 -
C++编译器对类中成员函数的处理(引用this指针)
定义对象的过程可以理解为: Test t(1,2)=====> Test (this,1,2)====> Test (&t,1,2)原创 2015-07-07 16:12:40 · 528 阅读 · 0 评论 -
虚函数、虚指针和虚表
关于虚函数的背景知识用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。多态用虚函数来实现,结合动态绑定。纯虚函数是虚函数再加上= 0。并且该函数只有声明,没有实现。抽象类是指转载 2015-07-13 19:03:51 · 624 阅读 · 0 评论 -
类中static并没有那么简单
class A{public: static int a; void printA () { cout << a << endl; }};void main (){原创 2015-07-12 11:14:36 · 427 阅读 · 0 评论 -
C++虚函数
C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:class A{public:virtual void foo() { cout << "A::foo() is called" << endl;}};class B: public A{p转载 2015-07-14 13:25:53 · 498 阅读 · 0 评论 -
父类指针能否找到子类成员及定位虚指针
多态实现时能否找到子类独有的成员: 先看如下代码:class Parent{public: int a; int b; void SetA(int a) { this->a = a; } virtual void printA() { cout << "Parent" << endl; }};原创 2015-07-28 12:48:08 · 1661 阅读 · 0 评论 -
为什么要用虚析构函数
1 问题引出:为什么要使用虚析构函数?class A //父亲{public: ~A() { cout << "调用了父亲的析构函数"<<endl; }};class B : public A //儿子{public: ~B() { cout << "调用了儿子的析构函数" << endl; }};int原创 2015-07-15 17:57:48 · 901 阅读 · 0 评论 -
拷贝构造函数的参数为什么必须是引用?
我们知道类中经常要用到拷贝构造函数,但是在使用的时候有没有想过,为什么他的参数必须是引用? 不是引用不行么?原创 2015-08-25 11:18:23 · 5559 阅读 · 2 评论 -
虚指针存在证明及虚函数表
C++多态的实现原理是依赖虚指针来辨别具体使用家族类中的哪一个函数。以下就来证明虚指针的存在。我们知道,指针的大小在一般情况下是4个字节,所以我们建立一个虚函数,再来计算该类的大小,便可以验证虚函数的存在。代码如下:#include <iostream>using namespace std;class A{public: void print ()原创 2015-07-13 16:14:14 · 1047 阅读 · 1 评论 -
类的匿名对象管理模型
类中匿名对象的生成原创 2015-07-08 16:53:53 · 423 阅读 · 0 评论 -
函数的返回值当左值
如果函数的返回值要当左值,那么必须返回一个引用:class Array{private: int mLength; int* mSpace;public: Array(int length){if( length < 0 ) {length = 0; }mLength = length;mSpace = new int[mLength];}原创 2015-07-10 15:22:56 · 787 阅读 · 0 评论 -
操作符重载:什么时候返回引用
返回一个已经存在的对象或者变量时最好返回一个引用(可以避免返回值做左值时的一些麻烦,以及不用生成匿名变量,可以节约资源,提高效率。),如:Complex & operator++(Complex & c){ c .a ++; c .b ++; return c ;}返回一个临时变量时,那么不要返原创 2015-07-10 20:31:50 · 1068 阅读 · 0 评论 -
c++ public、private和protected区别
private:访问范围:1.该类的成员函数。2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。(自己和最好的朋友 的成员函数可以访问你的私密信息,徒弟不可以访问)protected:访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数,徒弟的朋友也可以访问哦)。3.其友元函数访问。(自己、徒弟(包含徒弟朋友,既然让徒弟继承,当然徒弟也可原创 2015-07-05 12:19:09 · 653 阅读 · 0 评论 -
C++类中静态变量和静态方法的注意事项
一 静态变量 1、静态变量必须在外部定义和赋值 a、不能在 main() 函数中定义 b、不能在类的构造函数中定义 2、必须要定义静态变量,否则该变量没有内存空间(类中只是申明) 3、类本身可以直接调用静态变量 4、静态变量依旧符合public、private、protect特性 二 静态方法 1、静态方法可以被类直接调用,但是同静态变量一样符合public、priva原创 2015-07-26 13:51:04 · 9272 阅读 · 1 评论 -
继承时的初始化列表
问题引出:class Test{public: Test(int a, int b) { this->a = a; this->b = b; }private:原创 2015-07-11 19:34:02 · 1065 阅读 · 0 评论 -
C++面向对象模型
1、 基础知识C++编译器如何完成面向对象理论到计算机程序的转化? 换句话:C++编译器是如何管理类、对象、类和对象之间的关系 具体的说:具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那? 思考一下程序结果#include "iostream"using namespace std;class C1{public:int i; //4int j; //原创 2015-07-13 13:32:01 · 796 阅读 · 0 评论 -
类中重载和重写的区别
函数重载 必须在同一个类中进行 子类无法重载父类的函数,父类同名函数将被名称覆盖 重载是在编译期间根据参数类型和个数决定函数调用 函数重写 必须发生于父类与子类之间 并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类型决定函原创 2015-07-13 13:08:36 · 775 阅读 · 0 评论 -
部分运算符只能用友元函数(全局函数)重载 以及链式法则
有些运算符只能用友元函数(全局函数)重载,无法使用成员函数重载,如:class Complex{public: Complex() { } Complex(int a,int b) {原创 2015-07-10 12:46:57 · 2707 阅读 · 0 评论 -
C++中模板类使用友元模板函数
问题始于学习数据结构,自己编写一个单链表,其中用到了重载输出运算符<<,我写的大约这样:template <class T> class List{ friend std::ostream& operator << (std::ostream& os,const List<T>& slist); //……};用vs2008可编译,但无法链接:无法解析的外部符号后来上网查改为t转载 2015-07-21 00:32:39 · 609 阅读 · 0 评论