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

C++】多态 ⑩ ( 建议将所有函数声明为 virtual 虚函数 | 多态理解层次 | 父类指针和子类指针步长 )

对象可以直接获取到自身封装 普通函数 , 如果要访问虚函数 , 需要增加一次寻址操作 , 因此 这里建议不需要将有 多态 需求函数声明为 虚函数 ; C++ 中 指向某类型对象 指针 运算 ,...没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 步长是相同 ; 一、建议将所有函数声明为 virtual 虚函数 C++ 类中 , 每个 成员函数 都可以声明为 virtual...这里建议不需要将有 多态 需求函数声明为 虚函数 ; 二、多态理解层次 多态理解层次 : 多态实现效果 : 相同代码调用 , 有不同表现形态 ; 父类指针 可 指向子类对象 , 使用父类指针...: C++ 中 指向某类型对象 指针 运算 , 是 根据 指针类型 进行 , 指针 自增 ++ , 指针地址值 会增加 指针类型字节大小 ; : 指针 Student* p , 其类型是...自定义 Student 类型 , 则 p++ 计算结果是 p 指针地址值 加上 sizeof(*p) 对象字节长度 ; 显然 父类 与 子类 对象 字节大小是不同 , 在进行数组操作 ,

21550

C++系列笔记(十二)

定义异常类应继承std::exception,这让你能够重用捕获std::exception异常所有catch()块 总结:编写优秀C++代码 • 给变量指定(无论是对您还是其他人来说都)有意义名称...• 不要使用C风格字符串(char*'),也不要使用strelen()和strcopy()等函数。std::string更安全,还提供了很多有用方法,获取长度、进行复制和附加方法。...• 声明定义接受 POD 类型作为输入函数时,应考虑将参数声明为引用,以免调用函数时执行不必要复制步骤。...• 如果类包含原始指针成员,务必考虑如何在复制或赋值时管理内存资源所有 权,即应考虑编写复制构造函数和赋值运算符。 • 编写管理动态数组实用类时,务必实现移动构造函数和移动赋值运算符,以改善性能。...理想情况下,get()函数不应修改类成员,因此应将其声明为const函数。同样,除非要修改函数参数包含值,否则应将其声明为const引用。 • 不要使用原始指针,而应尽可能使用合适智能指针。

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

C++复习笔记——C++ 关键字

const const(常量,constant)所修饰对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明变量也不能调用任何const函数。...在函数声明定义时都要加上const,放在函数参数列表最后一个括号后。...类静态成员变量必须在声明文件范围内进行初始化才能使用,private类型例外。...void void(空),可以作为函数返回值,表明返回任何数据;可以作为参数,表明没有参数传入(C++中不是必须);可以作为指针使用。...如果一个类成员函数声明为 const类型,表示该函数不会改变对象状态,也就是该函数不会修改类静态数据成员。

1.3K30

为什么是int main()而不是void main()

(void main( )从来就不存在于C++或者C)下面我分别说一下C和C++标准中对main函数定义 1....C++ 正如C++ Primer Plus这本书中说C++98中定义了如下两种main函数定义方式: int main( ) int main( int argc, char *argv[] ) int...3.关于void main 在C和C++中,接收任何参数也返回任何信息函数原型为void fun(void);可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void...main函数返回值应该定义为int类型,C和C++标准中都是这样规定虽然在一些编译器中,void main可以通过编译(vc6),但并非所有编译器都支持void main,因为标准中从来没有定义过...0,则代表程序正常退出;返回其它数字含义则由系统决定,而在通常情况下,返回零代表程序异常退出。

3.5K70

Google C++编程风格指南(四)之类相关规范

在类定义中,将关键字explicit加到单参数构造函数前:explicit Foo(string name); 例外:在少数情况下,拷贝构造函数可以声明为explicit;特意作为其他类透明包装器类...接口(Interface) 接口是指满足特定条件类,这些类以Interface为后缀(必需),C++接口就是指纯抽象类。...定义:当一个类满足以下要求时,称之为纯接口: 1) 只有纯虚函数(”=0”)和静态函数(下文提到析构函数除外); 2) 没有静态数据成员; 3) 没有定义任何构造函数。...然而,极少数情况下需要重载操作符以便与模板或“标准”C++类衔接(operator<<(ostream&,const T&)),如果被证明是正当尚可接受,但你要尽可能避免这样做。...为后缀,除提供带实现虚析构函数、静态成员函数外,其他均为纯虚函数,不定义静态数据成员,不提供构造函数,提供的话,声明为protected; 为降低复杂性,尽量不重载操作符,模板、标准类中使用时提供文档说明

83121

C++ 类使用规范建议

例外:在少数情况下,拷贝构造函数可以声明为explicit;特意作为其他类透明包装器类。类似例外情况应在注释中明确说明。 4....(2)一般情况下,应该避免在构造函数和析构函数中调用虚函数,如果一定要这样做,程序猿必须清楚,这时对虚函数调用其实是实调用。可参考博客:C++不要在构造函数和析构函数中调用虚函数。...接口(Interface) 接口是指满足特定条件类,这些类以Interface为后缀(必需),C++接口就是指纯抽象类。...然而,极少数情况下需要重载操作符以便与模板或标准C++类衔接(operator<<(ostream&,const T&)),但尽可能避免这样做,万不得已情况下,不要忘了提供文档说明原因。 11....其他基类均为纯接口; (8)接口类类名以Interface为后缀,除提供带实现虚析构函数、静态成员函数外,其他均为纯虚函数,不定义静态数据成员,不提供构造函数,提供的话,声明为protected;

1.8K20

lnk2001 lnk1120_lnk1120

当试图从文件外部访问任何没有在该文件内声明静态变量时将导致编译错误或LNK2001。   函数声明变量(局部变量) 只能在该函数范围内使用。   C++ 全局常量只有静态连接性能。...导致 LNK2019 常见问题有: 符号声明包含拼写错误,以致于符号声明与符号定义不同。 使用了一个函数,但其参数类型或数量与函数定义匹配。...符号定义在编译为 C 程序文件中,而符号是在 C++ 文件中不带 extern “C” 修饰符声明。...在 Visual Studio .NET 2003 中,必须定义声明模板函数友元声明。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

97020

C++修行之道】类和对象(二)类6个默认成员函数、构造函数、析构函数

目录 一、类6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.2.5 自动生成默认构造函数 不进行显示定义隐患: 2.2.6 自动生成构造函数意义何在?...Date d3(); } 在C++中,当编译器看到一个像Date d3();这样声明时,它会根据语法规则将其解析为一个函数声明,而不是一个对象定义。...这是因为C++语法允许这样歧义,而且函数声明优先级高于对象定义。因此,即使你本意是想创建一个对象,编译器也会将其视为一个函数声明。为了避免这种歧义,最好不要在对象定义时使用空括号。...关于编译器生成默认成员函数,很多童鞋会有疑惑:不实现构造函数情况下,编译器会生成默认构造函数。但是看起来默认构造函数又没什么用?...解答:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供数据类型,:int/char...

6610

C++随记(八)---存储持续性、作用域和链接性

作用域为全局(也叫文件作用域)变量在定义位置到文件结尾之间都可用。 还有函数原型作用域、名称空间作用域、函数作用域等等。 三、链接性 链接性描述了名称如何在不同单元间共享。...总结:不同C++存储方式是通过存储持续性、作用域、链接性来描述。 ①自动存储持续性: 在默认情况下函数声明函数参数和 变量 为 自动存储持续性, 作用域为局部,无链接性。...自动变量:只在定义它们时候才创建,在定义它们函数返回时系统回收变量所占存储空间。对这些变量存储空间分配和回收是由系统自动完成。一般情况下,不作专门说明局部变量,均是自动变量。...因此C++提供了两种变量声明:一种是定义声明(简称定义),它给变量分配存储空间;另一种 是引用声明(简称声明),它不给变量分配存储空间,因为它引用已有的变量。...在默认情况下函数链接性为外部,即可在文件间共享。

99300

C++中列表初始化,你知多少?

类型匹配时可能调用构造函数 当列表初始化类型和目标类型匹配时,如果存在适当构造函数,编译器会尝试调用构造函数进行初始化。...这是因为在 C++ 中,如果声明一个函数时候带有空括号,编译器会将其解释为一个函数声明而不是一个对象定义。...unsetunset5、不适用列表初始化情况unsetunset 什么是聚合类型 1、类型是一个普通数组,int[5],char[],double[]等 2、类型是一个类,且满足以下条件: 没有用户声明构造函数...一个类如果有用户自定义构造函数、私有/受保护静态数据成员,或者基类没有默认构造函数,那么该类就不再是聚合类型。...这通常发生在类默认构造函数被误解为函数声明情况下

5710

左右值引用和移动语义

随着移动语义(后面我们会详细介绍)引入到 C++11 之中,值类别被重新进行了定义C++之父Bjarne Stroustrup在《“New” Value Terminology》中给出以区别表达式两种独立性质...常见纯右值有: 除字符串字面值以外字面值 返回引用类型函数调用 后置自增/减运算符链接表达式(i++/i--) 算术/逻辑/比较表达式(a+b,a&&b,a==b) 取地址表达式(&a...它形式:T&,根据const属性可以分为两种: const左值引用 const左值引用 例如: int a = 1; int& la = a;//la为a左值引用(const左值引用) la...C++11在头文件utility中声明了std::move()函数,该函数作用就是类型转换,通过它,我们可以 把一个左值,将其标记为右值。...具体形式如下: T (T &&) //移动构造函数典型声明形式 T (T &&) = default; //强制编译器生成移动构造函数

84740

【从零开始学深度学习编译器】十八,MLIR中Interfaces

Dialect中查到,并不需要确定特定Dialect子类(具体到某个Operation)。...需要注意是,这些类应该是纯,不应包含静态数据成员或其他可变数据。...这可以防止包含对象Dialect所有者和interface所有者都不知道Interface实现情况,这可能导致重复或发散实现。还没有碰到过需要使用这种机制情况,这里继续深入了。...这种基础设施缺点是它需要一些样板才能将所有部分连接在一起。MLIR 提供了一种机制,用于在 ODS 中以声明方式定义接口,并自动生成 C++ 定义。...可选:extraClassDeclaration。在Interface类声明中生成附加 C++ 代码。这允许在面向用户Interface类上定义方法等,不需要钩到 IR 实体。

1.8K20

C++ 特性使用建议

在C 语言中,如果函数需要修改变量值,参数必须为指针,int foo(int *pval),在 C++ 中,函数还可以声明引用参数int foo(int &val),定义引用参数防止出现 (*pval...某些情况下,将一个单元测试类声明成待测类友元会很方便。 友元扩大了(但没有打破)类封装边界。...因此, 我们强烈建议在任何可能情况下使用 const: (1)如果函数不会修改传你入引用或指针类型参数,该参数应声明为 const。 (2)尽可能将函数声明为 const。...访问函数应该总是 const。其他不会修改任何数据成员,未调用 const 函数,不会返回数据成员 const 指针或引用函数也应该声明成 const。...变量可以被声明成 constexpr 以表示它是真正意义上常量,即在编译时和运行时都不变。constexpr 可以定义用户自定义类型常量,也修饰函数返回值。

1.6K20

Google C++ 编程风格指南(五):其他 C++ 特性

C++ 中, 函数还可以声明引用参数: int foo(int &val). 优点: 定义引用参数防止出现 (*pval)++ 这样丑陋代码. 像拷贝构造函数这样应用也是必需....此外有时改用 C++11 推出 constexpr 更好。 定义: 在声明变量或参数前加上关键字 const 用于指明变量值不可被篡改 ( const int foo )....因此, 我们强烈建议在任何可能情况下使用 const: 如果函数不会修改传你入引用或指针类型参数, 该参数应声明为 const. 尽可能将函数声明为 const. 访问函数应该总是 const....其他不会修改任何数据成员, 未调用 const 函数, 不会返回数据成员 const 指针或引用函数也应该声明成 const....在合适情况下, 推荐使用标准类型 size_t 和 ptrdiff_t. 如果已知整数不会太大, 我们常常会使用 int, 循环计数. 在类似的情况下使用原生类型 int.

1.1K30

static在C和C++用法和区别

(对于C++class对象例外,class对象实例如果初始化,则会自动调用默认构造函数,不管是否是static类型) 特点: static局部变量”记忆性”与生存期”全局性” 二、外部静态变量...使用内部函数好处是:不同的人编写不同函数时,不用担心自己定义函数,是否会与其它文件中函数同名。...对于静态成员函数,只能访问静态成员函数和静态成员变量,不能访问静态成员函数或者变量。...三.extern关键字    在C语言中,修饰符extern用在变量或者函数声明前,用来说明“此变量/函数是在别处定义,要在此处引用”。   ...在C++中extern还有另外一种作用,用于指示C或者C++函数调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用函数

2.6K10

总结c++ primer中notes

// ok: declaration notdefinition   extern double pi =3.1416; // error: redefinition of pi   任何在多个文件中使用变量都需要有与定义分离声明...在这种情况下,一个文件含有变量定义,使用该变量其他文件则包含该变量声明(而不是定义)。 在变量使用处定义变量 一般来说,变量定义声明可以放在程序中能摆放语句任何位置。...我们可以把一个 const 变更定义在一个文件中,假设已经做了合适声明,就可在另外文件中使用这个变量: // file_1.cc   int counter;  // definition ( ...在引用情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型引用,但可以定义任何其他类型引用。...头文件用于声明而不是用于定义 头文件一般包含类定义、extern 变量声明函数声明。对于头文件不应该含有定义这一规则,有三个例外。

1.6K90

C++特性使用建议

在C 语言中,如果函数需要修改变量值,参数必须为指针,int foo(int *pval),在 C++ 中,函数还可以声明引用参数int foo(int &val),定义引用参数防止出现 (*pval...某些情况下,将一个单元测试类声明成待测类友元会很方便。 友元扩大了(但没有打破)类封装边界。...因此, 我们强烈建议在任何可能情况下使用 const: (1)如果函数不会修改传你入引用或指针类型参数,该参数应声明为 const。 (2)尽可能将函数声明为 const。...访问函数应该总是 const。其他不会修改任何数据成员,未调用 const 函数,不会返回数据成员 const 指针或引用函数也应该声明成 const。...变量可以被声明成 constexpr 以表示它是真正意义上常量,即在编译时和运行时都不变。函数或构造函数也可以被声明成 constexpr,以用来定义 constexpr 变量。

1.9K30

C++结构体和类区别_c++有结构体吗

0,而C++中空结构体/类 大小为1。...一个类中,虚函数、成员函数(包括静态与静态)和静态数据成员都是不占用类对象存储空间。...堆栈空间有限,对于大量逻辑对象,创建类要比创建结构好一些 2. 结构表示点、矩形和颜色这样轻量对象,例如,如果声明一个含有 1000 个点对象数组,则将为引用每个对象分配附加内存。...在此情况下,结构成本较低。 3. 在表现抽象和多级别的对象层次时,类是最好选择 4. 大多数情况下该类型只是一些数据时,结构时最佳选择,因为类访问数据 通常需要函数辅助。...版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。

94010
领券