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

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

先说构造函数,构造函数作为函数是不可以,首先c++编译器上不会让你通过 在内存上,我们知道,一个对象会有一个函数表,函数表在构造函数初始化,可是一个对象还没有完成实例化,他函数表是不存在...,一个对象需要调用构造函数完成实例化,这里形成了一个悖论 在意义上,将构造函数声明为函数没有意义,函数主要是实现多态,c++多态是在运行时构建基来调用不同函数,而不是根据情况动态调用构造函数...构造函数是不行,但是函数作为函数确实常用,特别是基函数一定要声明为函数。首先既然对象存在,那么函数表肯定存在,所以函数作为函数是合理。...这时候如果是基指针指向子类对象,那么删除指针,只会调用基函数,因为这时候对象类型是基对象,函数没有动态绑定,只会调用当前对象类型。...但是如果将基函数声明为函数,则能成功调用子类函数 #include using namespace std; class Father { public:

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

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

开始学C++了,所以又重拾以前学习过相关概念… 函数是当一个对象生命周期结束时,会自动执行函数。...当一个不准备作为基使用时,就不要定义函数了,因为它会增加一个函数表,使得对象体积翻倍,还有可能降低其移值性。 所以基本一条是:无故声明函数和永远不去声明一样是错误。...当且仅当里包含至少一个函数时候,才去声明函数。 抽象是准备被用做基,基必须要有一个函数,纯函数会产生抽象,所以在想要成为抽象里声明一个纯函数。...… B::f() A::ff() //定义指向基对象指针a,当调用f()方法时,因为f为函数,所以调用了派生f(),输出B::f(); 参考: 详解C++函数函数区别)&多态性以及实例应用...C++函数、构造函数函数关系 C++函数工作原理和()继承内存占用大小计算

1.4K40

C++函数解析

当派生对象从内存撤销时一般先运行派生函数,然后再调用基函数。...解决方法是将基及派生函数设为函数,这时无论基指针指向哪个派生对象,系统会采用动态关联,调用相应函数对对象进行清理。...下面将基函数改成函数 virtual   ~Point(){ std::cout << "Point destructor" << std::endl; } 其它不变,再运行: ?...这样就达到我们目的了,基,派生都调用了函数,另外需要注意是 在基函数声明为函数时,由该基派生函数也自动成为函数,即使派生函数与基函数名字不相同。  ...程序显示用delete运算符删除一个对象,而这个对象是指向派生对象指针,系统调用相应派生函数

90070

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

A 构造函数 , 然后调用 B 构造函数 , 最后调用 C 构造函数 ; 参考 【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数函数 调用规则 ) 博客 , 构造函数...; 自身定义 函数 ; 然后 , 调用 成员 函数 ; 也就是 成员变量 类型 函数 ; 最后 , 调用 父 函数 ; 2、函数以是函数 函数以是 函数 ; 函数...virtual ~Base() {} }; 4、函数意义 父中使用了 函数 , 在 子类 , 必须 覆盖 父 函数 , 并且使用相同函数签名 ; 如果 子类 没有提供自己..., 只有在 父 函数函数 时 , 子类 函数才必须是函数 ; 如果 父 函数 不是 函数 , 则 子类 函数以是 普通 非虚函数 ; 二、代码示例 -...函数 1、代码示例 - 没有使用函数导致子类函数无法调用 在下面的代码 , 声明 子类指针 指向 子类对象 , 释放 子类指针 时 先调用 子类函数 , 再调用父函数 ; 声明

19520

多态函数

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

74360

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

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

74020

C++:50---函数

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

80720

抽象函数

3、继承抽象意义就是提供族类公共接口。 4、子类继承函数,如果未实现,子类仍然为抽象,仍然不能被实例化。 【函数若干限制】 1、只有成员函数才能声明为函数。...函数仅适用于有继承关系对象,所以普通函数不能声明为函数。 2、静态成员函数不能是函数静态成员函数不受对象捆绑,只有信息。 3、内联函数不能是函数。...4、构造函数不能是函数,构造时,对象创建尚未完成。构造完成后,能算一个名符其实对象。 5、函数以是函数且通常声明为函数。...(2, 4, 8); s->draw(); // delete 指针,调用函数 delete s; return 0; } 以上代码演示了纯函数定义,但上面代码存在一个问题,我们先看一下运行结果...,初始化为 0,提供族类公共接口 virtual void draw() = 0; // 增加 virtual 关键字,让其自动执行子类函数 virtual ~Shape() { cout <

16530

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

在Visual C++,包含函数对象指针被安排在对象起始地址处,并且函数表(vtable)地址是由构造函数写入指针。...2.不要在函数调用函数原因 同样,在函数调用函数函数入口地址也是在编译时静态决定。也就是说,实现是实调用而非虚调用。 考察如下例子。...对象b退出作用域时,会先调用B函数,然后调用A函数,在函数~A(),调用了函数show()。...从输出结果来看,A函数对show()调用并没有发生调用。...从概念上说,函数是用来销毁一个对象,在销毁一个对象时,先调用该对象所属函数,然后再调用其基函数,所以,在调用基函数时,派生对象“善后”工作已经完成了,这个时候再调用在派生定义函数版本已经没有意义了

2.7K30

C++构造函数函数

C++每个都有其构造与函数,它们负责对象创建和对象清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。...下面仍然是通过反汇编方式来说明C++构造和函数是如何工作。...编译器是否真的会默认提供构造与函数 在一般讲解C++书籍中都会提及到当我们不为提供任何构造与函数时编译器会默认提供这样六种成员函数:不带参构造,拷贝构造,“=”重载函数函数,以及带const...+代码与之前仅仅是多了一个函数,这个时候编译器为这个定义了一个默认构造函数,从汇编代码可以看到,这个构造函数主要初始化了对象头4个字节,将函数地址放入到这个4个字节,因此我们得出结论...,但是接着执行函数函数定义对象,接受返回值得这块内存一直等到它所在语句块结束才调用 如果不要这个返回值时又如何呢,下面的代码说明了这个问题 int main() {

1.5K10

从零开始学C++函数与多态(二):纯函数、抽象函数

构造函数不能是函数函数以是函数 1、抽象不能用于直接创建对象实例,可以声明抽象指针和引用 2、可使用指向抽象指针支持运行时多态性 3、派生必须实现基函数,否则它仍将被看作一个抽象...,并能管理该对象 可以添加新(已有派生新对象,并能管理该对象 四、函数 函数可以声明为函数 delete 基指针; 程序会根据基指针指向对象类型确定要调用函数...基函数函数,所有派生函数都是函数 构造函数不得是函数 如果要操作具有继承关系动态对象,最好使用函数。...特别是在派生函数需要完成一些有意义操作,比如释放内存 函数还可以是。...如果想要将它定义成抽象,只能将函数声明为纯 // 通常情况下在基函数不需要实现 // 例外是纯函数要给出实现。

1.3K00

C++ 构造函数函数调用函数注意事项

在Visual C++,包含函数对象指针被安排在对象起始地址处,并且函数表(vtable)地址是由构造函数写入指针。...同样,在函数调用函数函数入口地址也是在编译时静态决定。也就是说,实现是实调用而非虚调用。 考察如下例子。...对象b退出作用域时,会先调用B函数,然后调用A函数,在函数~A(),调用了函数show()。...从输出结果来看,A函数对show()调用并没有发生调用。...从概念上说,函数是用来销毁一个对象,在销毁一个对象时,先调用该对象所属函数,然后再调用其基函数,所以,在调用基函数时,派生对象“善后”工作已经完成了,这个时候再调用在派生定义函数版本已经没有意义了

90610

构造函数函数

一、构造函数函数由来 数据成员不能在声明时候初始化,为了解决这个问题? 使用构造函数处理对对象初始化。...二、构造函数 (1)初识初始化 C++支持两种初始化形式:复制初始化和直接初始化,对于直接初始化直接调用实参匹配构造函数,复制初始化总是调用复制构造函数。...三、函数 函数和构造函数作用相反,释放对象使用资源,并销毁非static成员。 (1)内存泄漏 下面代码有何隐患?...其实也是一样,上述代码就会有内存泄漏风险。如何解决呢?看下述代码。 在上述代码,我们在函数,添加delete函数。解决了内存泄漏问题,但是还存在其他问题。...4、当函数存在手动释放资源时侯,一定要注意之前是否释放过,以及以后是否有其他操作会释放。

1.7K20

C++编程经验(2):为函数必要性

这个要提一下,如果记不住就记住:如果不做函数,会有内存泄漏 解释 定义一个基指针p,在delete p时,如果基函数函数,这时只会看p所赋值对象,如果p赋值对象是派生对象,...就会调用派生函数;如果p赋值对象是基对象,就会调用基函数,这样就不会造成内存泄露。...如果基函数不是函数,在delete p时,调用函数时,只会看指针数据类型,而不会去看赋值对象,这样就会造成内存泄露。 多少学点设计模式就清楚了。...接下来是一个子类 class Inherit :public Base{ //此处省去,一切从简 }; //重点看调用 int main() { Base *p = new Inherit; //这种方式调用...,这时候有没有就不一样了 delete p; Base *q = new Base; delete q; return 0; }

55610

C++和对象】构造函数函数

目录 前言 1.6个默认成员函数 2.构造函数 2.1概念 2.2构造函数特性 3.函数 3.1概念 3.2函数特性 4.结语 1.6个默认成员函数 如果一个什么成员都没有,简称为空...例如: class Date {}; 空真的什么都没有?并不是,任何在什么都不写时,编译器会自动生成以下6个默认成员函数。...3.2函数特性 函数是特殊成员函数,其特征如下: 函数名是在名前加上字符 ~。 无参数无返回值类型。 一个只能有一个函数。若未显式定义,系统会自动生成默认函数。...注意:函数不能重载。 对象生命周期结束时,C++编译系统系统自动调用函数。...而Date没有显式提供函数,则编译器会给Date生成一个默认函数,目的是在其内部调用Time函数 如果类没有申请资源时,函数可以不写,直接使用编译器生成默认函数,比如

10410

C++核心准则C.82:不要在构造函数函数调用函数

C.82: Don't call virtual functions in constructors and destructors C.82:不要在构造函数函数调用函数 Reason...到目前为止,被调用函数应该只属于构造对象本身,而不是可能存在于派生某个覆盖函数。那样做非常难理解。...最坏情况,在构造函数或者函数中直接或间接调用一个没有实现函数会导致没有定义行为。...从构造函数函数调用函数并不是本身有什么错误。这种调用语义是安全。然而,经验表明这样调用很少是必须,很容易扰乱维护者,如果被新手使用会成为错误源。...提示来自构造函数函数函数调用。

73150

c++和对象(三)构造函数函数

构造函数是一种特殊成员函数,它在创建对象时自动调用,其主要目的是初始化对象。在C++,构造函数具有与其所属相同名称,并且没有返回类型。...Time对象,为什么最后会调用Time函数?...d销毁时,要将其内部包含Time_t对象销毁,所以要调用Time函数 但是:main函数不能直接调用Time函数,实际要释放是Date对象,所以编译器会调用Date函数...,而Date没有显式提供,则编译器会给Date生成一个默认函数,目的是在其内部调用Time函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁 main函数并没有直接调用...Time函数,而是显式调用编译器为Date生成默认函数注意:创建哪个对象则调用该类函数,销毁那个对象则调用该类函数 如果类没有申请资源时,函数可以不写,直接使用编译器生成默认函数

12310
领券