Welcome 微信登录

首页 / 软件开发 / C++

C++:使用非成员函数(non-member)处理函数的所有参数都需要类型转换

C++:使用非成员函数(non-member)处理函数的所有参数都需要类型转换

C++:使用非成员函数(non-member)处理函数的所有参数都需要类型转换2014-11-14有些函数, 所有参数都需要使用类型转换, 比如乘法, 写一个有理数类Rational, 需要执行乘法操作:函数满足: Rational = Rational*double; Rational = double*Rational; 则需要使用非成员函数(non-member);成员函数的发起者必须是类, 因为可能出现double类型在前的情况, 则无法执行乘法,...
C++:派生类强制转换为基类

C++:派生类强制转换为基类

C++:派生类强制转换为基类2014-11-14在多态的使用时, 派生类的指针或引用可以转换为基类的指针或引用, 即基类的指针可以指向派生类的基类部分;Base* b = Derived* d;b和d指向的内容是相等的, b == d, 因为之间有一个隐式转换即 b == (Base*)d;b和d的地址是不同的 int(b) != int(d), 因为b指向d的基类部分, d指向的是完整的派生类;但如果进行隐身转换, int(b) != int((Base...
C++:类的虚函数及虚继承所占的空间

C++:类的虚函数及虚继承所占的空间

C++:类的虚函数及虚继承所占的空间2014-11-14char占用一个字节, 但不满足4的倍数时, 会进行数据对齐, 使用4的倍数的字节(byte).GCC:GCC中, 无论是虚函数还是虚继承, 都需要将指针存储在虚函数表(virtual function table), 占用4个字节.继承会继承基类的数据, 和虚函数表, 即继承基类的空间.代码:/** test.cpp**Created on: 2014.04.20*Author: Spike*//*...
C++:模板类使用成员函数模板处理隐式(implicit)转换

C++:模板类使用成员函数模板处理隐式(implicit)转换

C++:模板类使用成员函数模板处理隐式(implicit)转换2014-11-14指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针可以转换为基类指针.但是模板的实例化(instantiations)之间, 是单独存在的,派生类的实例化的模板(SmartPtr<Derived>), 不能转换为基类实例化的模板(SmartPtr<Base>);需要明确的编写, 因为派生类也可以继续做为基类, 产生派...
C++:将参数无关的代码抽离模板(templates)

C++:将参数无关的代码抽离模板(templates)

C++:将参数无关的代码抽离模板(templates)2014-11-14模板(template)可以节省时间, 和避免代码重复, 但是有可能导致代码膨胀;在设计模板时, 需要进行共性和变性分析(commonality and variability analysis), 把变性写入模板, 把共性抽出来, 写入其他模板,然后通过调用的形式,避免代码膨胀, 即是抽出模板参数无关的代码.可以设计一个基类, 使用私有(private)继承的形式, 做为派生类的实...
C++:派生类访问模板化基类(templatized base class)的命名

C++:派生类访问模板化基类(templatized base class)的命名

C++:派生类访问模板化基类(templatized base class)的命名2014-11-14派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名.原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问.派生类访问模板化基类, 包含三种方法:1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查;2. 使用using声明式, 可以把基...
C++:默认复制构造函数 执行 浅拷贝

C++:默认复制构造函数 执行 浅拷贝

C++:默认复制构造函数 执行 浅拷贝2014-11-14C++, 会默认生成一个复制构造函数, 当类中出现指针时, 复制会执行浅拷贝, 即只复制指针的地址, 不会复制数据;所以在类中, 使用指针时, 需要注意; 如果想使用深拷贝, 可以添加复制构造函数.以下代码, 如果不添加复制构造函数, 则会运行出错, 但可以通过编译,运行时, 因为删除(delete[])两次str所指的同一片地址空间, 所以程序无法执行.代码:/** main.cpp**Creat...
C++:模板(template)中typename的使用方法

C++:模板(template)中typename的使用方法

C++:模板(template)中typename的使用方法2014-11-14声明template参数时, 前缀关键字class和typename可以互换;使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用.从属名称(dependent names): 模板(template)内出现的名称, 相依于某个模板(template)参数, 如T t;嵌套从属名称(nested dependent names):从属名称在c...
C++:类的成员变量 声明顺序 与 初始化顺序 相同

C++:类的成员变量 声明顺序 与 初始化顺序 相同

C++:类的成员变量 声明顺序 与 初始化顺序 相同2014-11-14类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行;否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量;同时GCC, 也会发出警告, 如: "class::m_xxx" will be initialized after [-Wreorder]代码:/** BInsertSort.cpp**Created...
C++:显示接口&运行期多态 和 隐式接口&编译期多态

C++:显示接口&amp;运行期多态 和 隐式接口&amp;编译期多态

C++:显示接口&运行期多态 和 隐式接口&编译期多态2014-11-14类(class)和面向对象:显示接口(explicit interface): 即在源代码中可见, 可以在头文件内看到类的所有接口;运行期多态(runtime polymorphism):成员函数是virtual, 传入类的引用或指针时, 在运行时, 会自动匹配接口, 可能是基类的接口, 也可能是派生类的;模板(templates)和泛型编程(generic prog...
C++:explicit在构造函数的使用及详解

C++:explicit在构造函数的使用及详解

C++:explicit在构造函数的使用及详解2014-11-16explicit的主要用法就是放在单参数的构造函数中,防止隐式转换, 导致函数的入口参数, 出现歧义.如果可以使用A构造B, 未加explicit的构造函数, 当使用B进行参数处理时, 就可以使用A, 使得接口混乱.为了避免这种情况, 使用explicit避免隐式构造, 只能通过显示(explicit)构造.下面是代码, 仔细阅读必有收获, 可以试着删除explicit, 调用注释的语句./...
C++:接口继承(interface) 和 实现继承(implementation) 详解

C++:接口继承(interface) 和 实现继承(implementation) 详解

C++:接口继承(interface) 和 实现继承(implementation) 详解2014-11-16继承接口和实现, 主要包含三种方式:1. 只继承接口, 纯虚函数;2. 继承接口和实现, 允许覆写(override), 虚函数;3. 继承接口和实现, 不允许覆写(override), 非虚函数;1. 纯虚函数:只继承接口, 但是派生类必须实现其接口;纯虚函数也可以包含实现, 但是只能在指明类(即, class::)的时候使用2. 虚函数:继承接...
<< 141 142 143 144 145 146 147 148 149 150 >>