首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++学习笔记 -- 函数与纯函数

(void); //函数 private: int a; int b; int c; }; #endif 函数与纯函数的定义(假定类名为A): #ifndef...“virtual”,使它成为“函数”了,这就是“函数”存在的意义 :) 函数的作用并不是删除对象,而是撤销对象占用内存之前完成的一些清理工作… //===================...当一个类不准备作为基类使用时,就不要定义函数了,因为它会增加一个函数表,使得对象的体积翻倍,还有可能降低其可移值性。 所以基本的一条是:无故的声明函数和永远不去声明一样是错误的。...当且仅当类里包含至少一个函数的时候,才去声明函数。 抽象类是准备被用做基类的,基类必须要有一个函数,纯函数会产生抽象类,所以在想要成为抽象类的类里声明一个纯函数。...C++函数、构造函数函数关系 C++中函数工作原理和()继承类的内存占用大小计算

1.4K40
您找到你想要的搜索结果了吗?
是的
没有找到

和纯

和纯 多态使用时,如果子类有属性开辟到堆区,那么父类指针在释放时无法带调用到子类的代码 解决方式:将父类的函数改为纯或者 和纯的共性: 1.可以解决父类指针释放子类对象...2.都必须要有具体的函数实现 和纯的区别: 如果是纯,该类属于抽象类,无法实例化对象 #include #include using namespace...void speak() { cout << "动物在说话" << endl; } // virtual ~animal() { cout << "animal的函数调用"...; } //写一个函数释放堆区内存 virtual ~cat() { if (name !...name; }; void test() { animal* a =new cat("tom"); a->speak(); delete a; //如果不在函数前加virtual,就只会调用父类函数

49510

C++函数解析

当派生类对象从内存中撤销时一般先运行派生类的函数,然后再调用基类的函数。...解决的方法是将基类及派生类的函数设为函数,这时无论基类指针指向哪个派生类对象,系统会采用动态关联,调用相应的函数对对象进行清理。...下面将基类的函数改成函数 virtual   ~Point(){ std::cout << "Point destructor" << std::endl; } 其它的不变,再运行: ?...这样就达到我们的目的了,基类,派生类都调用了函数,另外需要注意的是 在基类的函数声明为函数时,由该基类派生的函数也自动成为函数,即使派生类的函数与基类的函数名字不相同。  ...对象cl在函数fc结束时执行Circle的函数,撤销局部变量c1.p所指向的对象的地址通过函数返回值赋予q,q所指向的对象在执行delete时执行函数

89670

多态中的函数

为什么函数要声明成virtual呢? 因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么函数不为就会导致无法调用子类函数,从而导致资源泄露。...如果把virtual属性去掉,那么被调用的是~Animal(),Dog类的构造函数被调用而函数未被调用,构造函数中分配的资源没有释放,从而产生了内存泄漏。...函数缺省声明为virtual,就可以避免这一问题。...去掉函数的virtual属性后,因为该类中没有其他的virtual函数,所以编译时不会生成v-table,这样就节省了编译时间,并减少了最终生成的程序的大小。...如果是,则调用: delete this; 因为Release()是virtual的,所以该COM对象对应的正确的派生类被调用,delete this会调用正确的函数,达到了使用virtual函数的效果

73960

【C++】多态 ⑤ ( 函数 | 函数语法 | 函数意义 | 父类指针指向子类对象情况下父类和子类使用 virtual 函数 | 代码示例 )

; 自身定义的 函数 ; 然后 , 调用 成员 函数 ; 也就是 成员变量 类型的 函数 ; 最后 , 调用 父类 函数 ; 2、函数可以是函数 函数 可以是 函数 ; 函数...; 释放 A 类型的指针 , 需要调用其子类 B 类型对象的 函数 , 此时需要将 A 类型 和 B 类型的 函数 声明为 函数 ; 3、函数语法 函数 的 语法 是 在 父类...~Base() {} }; 4、函数意义 父类中使用了 函数 , 在 子类 中 , 必须 覆盖 父类 的函数 , 并且使用相同的函数签名 ; 如果 子类 没有提供自己的 函数..., 只有在 父类 的函数函数 时 , 子类 的函数才必须是函数 ; 如果 父类 的 函数 不是 函数 , 则 子类 的 函数 可以是 普通的 非虚函数 ; 二、代码示例 -...函数 1、代码示例 - 没有使用函数导致子类函数无法调用 在下面的代码中 , 声明 子类指针 指向 子类对象 , 释放 子类指针 时 先调用 子类函数 , 再调用父类函数 ; 声明

17820

函数函数、静态函数、多态

为什么函数必须是函数 将可能会被继承的父类的函数设置为函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。...为什么C++默认的函数不是函数 C++默认的函数不是函数是因为函数需要额外的函数表和表指针,占用额外的内存。而对于不会被继承的类来说,其函数如果是函数,就会浪费内存。...因此C++默认的函数不是函数,而是只有当需要当作父类时,设置为函数。 静态函数函数的区别 静态函数在编译的时候就已经确定运行时机,函数在运行的时候动态绑定。...函数的实现:在有函数的类中,类的最开始部分是一个函数表的指针,这个指针指向一个函数表,表中放了函数的地址,实际的函数在代码段(.text)中。...当子类继承了父类的时候也会继承其函数表,当子类重写父类中函数时候,会将其继承到的函数表中的地址替换为重新写的函数地址。使用了函数,会增加访问内存开销,降低效率。

92220

抽象类纯函数

4、子类继承的纯函数,如果未实现,子类仍然为抽象类,仍然不能被实例化。 【函数的若干限制】 1、只有类的成员函数才能声明为函数函数仅适用于有继承关系的类对象,所以普通函数不能声明为函数。...5、函数可以是函数且通常声明为函数。...不能被实例化 // Rect r; // 使用子类对象初始化父类对象指针,构成多态 Shape *s = new Circle(2, 4, 8); s->draw(); // delete 指针,调用函数...,初始化为 0,提供族类的公共接口 virtual void draw() = 0; // 增加 virtual 关键字,让其自动执行子类函数 virtual ~Shape() { cout <...< “Shape destructor” << endl; } protected: int _x; int _y; }; 这样修改代码后,我们再次运行,结果就能看到,Circle 正常被了。

16330

什么时候使用函数

问题 什么时候该定义函数,为什么要这么做? 回答 当你通过一个基类指针去删除(delete)派生对象的时候,函数就很用了。...destructor called\n"; } }; int main() { Base *b = new Derived1(); delete b; } 注意,我并没有把类 Base 的函数定义为...输出如下: Base Constructor Called Derived constructor called Base Destructor called 我们发现派生类的函数并没有调用,这是有问题的...,有可能会造成内存泄漏,而解决这个问题的办法就是将 Base 的函数定义为(virtual), class Base { public: Base(){ cout <<...,否则你就应该定义为, 这个基类没有派生类 不在堆(heap)内存实例化 没有指向派生类的基类指针或引用 对于 1,还是很常见的,有的时候我们只是单纯的写一个类,并没有派生它的打算,那这个时候就无需将它的函数定义为

84020

C++:50---函数

二、函数 使用方法和规则与函数一样 格式要求: 函数要求基类与派生类中的名称不一致 只要基类的函数函数,就能确保我们在释放指针时准确的运行哪个版本(基类or派生类)的函数 如果基类指针指向于自己...,那么delete的时候执行的就是自己的函数 如果基类指针指向于派生类对象,那么delete的时候执行的就是派生类的函数(这个就是多态的性质,与执行函数的原理一样) 如果基类的函数不是函数...三、函数的其它注意事项 ①前面我们介绍过如果一个类需要函数,那么它同样需要拷贝和赋值操作。...但是基类的函数并不遵循这个规则:一个基类总是需要函数,而且它能将函数设定为函数,此时,该函数为了成为函数而令内容为空,我们显然无法由此推断该基类还释放需要复制运算符或拷贝构造函数...②函数将阻止合成移动操作:基类需要一个函数这一事实还会对基类和派生类的定义产生另外一个间接的影响:如果一个类定义了函数,即使它通过default的形式使用了合成的版本,编译器也不会为这个类合成一定操作

80320

C++核心准则C.127:包含函数的类应该有函数或保护函数

C.127: A class with a virtual function should have a virtual or protected destructor C.127:包含函数的类应该有函数或保护函数‍...包含函数的类通常(大多数情况下)通过指向基类的指针使用。通常,最后一个使用者必须通过指向基类的指针调用delete操作,通常是指向基类的智能指针,因此函数应该是公开的函数。...稍微特殊一些的情况是:如果不希望支持通过指向基类的指针销毁对象,函数应该是保护的非虚函数。参见C.35。...包含函数的类的函数要么是公开的函数,要么是保护的非虚函数。...提示针对包含函数却没有函数的类的销毁操作。

73420

C++之

如果子类有自己的指针属性,那么就需要将父类的函数声明为函数,否则通过父类指针(或者引用)无法调用子类的函数。...= this->name) { free(this->name); this->name = nullptr; } cout << "基类函数" << endl; } }...delete对象指针s的时候,并没有调用派生类的函数,这造成了内存泄漏。如果有很多都是父类指针指向子类对象的,并且程序一致不结束,那么这将是非常可怕的。为此C++为我们提供了。...有了就不用太过担心内存泄漏的发生。 当我们在父类声明函数。那么这时候delete对象指针s就不会有内存泄漏发生。 ?...函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。 当一个类不作为基类使用的时候不要把它的函数声明为函数,这样会增加一个函数表。使类的体积增大。

41310

C++-函数之构造函数函数分析

1.构造函数不能为函数 当我们将构造函数定义为函数时,会直接报错: ?...函数表的作用在于,存储每个类的相同的函数名,然后每一次函数调用,都会去函数表查找地址 分析: 假如构造函数函数的话,由于对象开始还未分配内存空间,所以根本就无法找到函数表,从而构造函数也无法被调用...函数可以为函数 首先回忆下函数: 当某个内对象被注销时,编译器会自动顺序调用该类以及其父类的函数,而不会调用派生类的函数....函数的好处 假如我们通过派生类生成基类对象时,如果函数函数,则我们释放其基类对象时,能使整个类(包括派生类)对象完全释放,如果函数只是普通函数,则不能完全....分析: 所以当我们在用多态的时候(通过基类来调用派生类成员函数),函数最好为函数 示例如下: #include using namespace std; class ClassBase

1.2K20

C++不要在构造函数函数中调用函数

2.不要在函数中调用函数的原因 同样的,在函数中调用函数函数的入口地址也是在编译时静态决定的。也就是说,实现的是实调用而非虚调用。 考察如下例子。...,然后调用类A的函数,在函数~A()中,调用了函数show()。...从输出结果来看,类A的函数对show()调用并没有发生调用。...从概念上说,函数是用来销毁一个对象的,在销毁一个对象时,先调用该对象所属类的函数,然后再调用其基类的函数,所以,在调用基类的函数时,派生类对象的“善后”工作已经完成了,这个时候再调用在派生类中定义的函数版本已经没有意义了...因此,一般情况下,应该避免在构造函数函数中调用函数,如果一定要这样做,程序猿必须清楚,这是对函数的调用其实是实调用。

2.7K30

构造函数函数可以是函数吗,在里面能调用函数

构造函数作为函数让人觉得是你的构造函数可能是动态的,那我觉得这可能是另一个设计模式,对象固定,构建方法动态来达到多态的目的,后面这段是我自己的看法 函数作为函数?...构造函数是不行的,但是函数作为函数确实常用的,特别是基类的函数一定要声明为函数。首先既然对象存在,那么函数表肯定存在,所以函数作为函数是合理的。...那么函数作为函数在什么场景下会用到呢,看看下面这段代码 #include using namespace std; class Father { public: Father...这时候如果是基类指针指向子类对象,那么删除指针,只会调用基类的函数,因为这时候对象类型是基类对象,函数没有动态绑定,只会调用当前对象类型的。...但是如果将基类函数声明为函数,则能成功调用子类的函数 #include using namespace std; class Father { public:

1.1K50

C++多态之和纯分析与示例

和纯 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的代码 解决方式:将父类中的函数改为或者纯 和纯共性: 可以解决父类指针释放子类对象...都需要有具体的函数实现 和纯区别: 如果是纯,该类属于抽象类,无法实例化对象 语法: virtual ~类名(){} 纯语法: virtual ~类名() = 0; 类名...<< endl; } virtual void Speak() = 0; //函数加上virtual关键字,变成函数 virtual ~Animal() = 0; }; 语法强制纯函数必须有函数实现...注意:区别于纯函数可以只写声明不写实现,纯需要声明也需要实现。有了纯后,这个类也属于抽象类,无法实例化对象。...或纯就是用来解决通过父类指针释放子类对象 ​ 2. 如果子类中没有堆区数据,可以不写为或纯 ​ 3. 拥有纯函数的类也属于抽象类

41610
领券