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

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

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

27750

C++系列笔记(十二)

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

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

    this指针小总结

    this指针小总结 在C++中,this指针是一个隐式静态成员指针,它指向调用它对象地址。每个静态成员函数都含有一个this指针,该指针在成员函数中用于访问调用它对象成员。...在C++中,this指针只在类静态成员函数中存在,而在全局范围内,是没有this指针。...this指针和普通指针区别 this指针和普通指针在C++中有几个关键区别: 存在性和可见性: this指针:它只在类静态成员函数内部隐式存在,并且你不需要(也不能)显式地声明它。...在某些情况下链式调用或需要区分成员变量和局部变量时,this指针特别有用。...普通指针:静态成员函数可以像其他函数一样使用普通指针作为参数或局部变量。 总结:this指针是C++中类一个特殊特性,它隐式地存在于静态成员函数中,并用于访问和修改对象成员。

    6610

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

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

    1.3K30

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

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

    87421

    C++ 类使用规范建议

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

    1.8K20

    为什么是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.6K70

    lnk2001 lnk1120_lnk1120

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

    1K20

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

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

    15210

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

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

    1K00

    八、特殊成员

    静态成员函数没有this指针,因此它不能直接访问类静态成员变量或静态成员函数。 静态成员函数可以直接通过类名和作用域解析运算符::调用,无需创建类对象。...在构造函数或析构函数中,this 指针指向是正在构造或正在析构对象。 虽然 this 指针在成员函数中是隐式可用,但在某些情况下模板编程或需要显式转换对象类型时),你可能需要显式地使用它。...// obj.modify(); // 错误:modify不是const成员函数,不能被const对象调用 } mutable 在C++中,mutable关键字是一个比较特殊修饰符,它用于声明成员变量即使在类...友元 C++友元(Friend)是一种定义在类之外函数或另一个类,但它有权访问类私有(private)成员和保护(protected)成员(注意,它不能访问类公有成员,因为公有成员默认就是对外开放...成员指针是 C++ 中一个较为高级特性,用于在需要灵活处理类成员访问场合,泛型编程、反射(虽然 C++ 标准库直接支持反射,但成员指针可以在一定程度上模拟反射行为)等。

    4810

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

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

    8110

    左右值引用和移动语义

    随着移动语义(后面我们会详细介绍)引入到 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; //强制编译器生成移动构造函数

    87740

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

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

    1.9K20

    五、从C语言到C++(五)

    尾拖返回类型 在C++中,尾置返回类型(Trailing Return Type)或称为后置返回类型(Postfix Return Type)是一种在函数声明定义中指定返回类型语法特性,它特别有用于处理模板函数中返回类型依赖于模板参数情况...返回类型参与函数重载判定(即返回类型不同不能构成重载)。 注意:在C++中,函数重载是通过参数列表来区分,而不是通过函数名或返回类型。因此,你不能仅通过改变函数名或返回类型来重载一个函数。...消除函数调用副作用:在某些情况下函数调用可能会产生副作用,修改全局变量或静态变量值。而内联函数可以避免这种副作用,因为其在编译时展开,不会进行实际函数调用。...即使函数声明为内联,编译器也有权选择忽略这个建议,不将函数内联化。这通常发生在函数体过大、过于复杂,或者编译器认为内联化不会带来性能提升情况下。...C++还提供了许多其他特性和功能,异常处理、类和对象、继承、多态等,这些都使C++成为一种功能强大编程语言。

    7310

    C++ 特性使用建议

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

    1.7K20

    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

    总结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
    领券