
C++
文章平均质量分 69
C++
qq_52484093
这个作者很懒,什么都没留下…
展开
-
类模板深度剖析
可以指定类模板的特定实现部分类型参数必须显示指定根据类型参数分开实现类模板重定义一个类模板和一个新类 (或者两个类模板)使用的时候需要考虑如何选择的问题特化以统一的方式使用类模板和特化类编译器自动优先选择特化类。原创 2023-09-19 17:16:38 · 120 阅读 · 0 评论 -
类模板的概念和意义
C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能。 用于说明类中使用的泛指类型 T。如:数组类,链表类,Stack 类,Queue 类,等。类模板外部定义的成员函数需要加上模板 声明。声明的泛指类型 T 可以出现在类模板的任意地方。在 C++ 中是否能够将泛型的思想应用于类?类中数据组织的方式和数据元素的具体类型无关。类模板以相同的方式处理不同类型的数据。类模板不能分开实现在不同的文件中。以相同的方式处理不同的类型。原创 2023-09-19 16:45:09 · 153 阅读 · 0 评论 -
深入理解函数模板
无法自动推导返回值类型可以从左向右部分指定类型参数工程中将返回值参数作为第一个类型参数!原创 2023-09-19 15:51:51 · 93 阅读 · 0 评论 -
函数模板的概念和意义
Swap 泛型写法中的 T 不是一个具体的数据类型,而是泛指任意的数据类型。template 关键字用于声明开始进行泛型编程。函数模板是泛型编程在 C++ 中的应用方式之一。C++ 中有没有解决方案集合两种方法的优点?typename 关键字用于声明泛指类型。函数模板是 C++ 中重要的代码复用方式。函数模板能够根据实参对参数类型进行推导。C++ 中有几种交换变量的方法?函数模板支持显示的指定参数类型。不考虑具体数据类型的编程方式。原创 2023-09-19 14:18:32 · 151 阅读 · 0 评论 -
经典问题解析四
构造函数和析构函数不能发生多态行为,只调用当前类中定义的版本!new / delete 会触发构造函数或者析构函数的调用。dynamic_cast 是与继承相关的类型转换关键字。编译器会检查 dynamic_cast 的使用是否正确。dynamic_cast 是与继承相关的专用转换关键字。dynamic_cast 要求相关的类中必须有虚函数。delete 和 free 的区别是什么?new 和 malloc 的区别是什么?malloc 是由 C 库函数提供的函数。delete 能够触发析构函数的调用。原创 2023-08-30 15:31:54 · 122 阅读 · 0 评论 -
被遗弃的多重继承
需要进行强制类型转换时,C++ 中推荐使用新式类型转换关键字!与多重继承相关的强制类型转换用 dynamic_cast 完成。与多继承相关的强制类型转换用 dynamic_cast 完成。当架构设计中需要继承时,无法确定使用直接继承还是虚继承!当多重继承关系出现闭合时将产生数据冗余的问题!工程开发中采用 "单继承多接口" 的方式使用多继承。C++ 是否允许一个类继承自多个父类?先继承一个父类,然后实现多个接口。多继承中可以出现多个虚函数表指针。C++ 支持多重继承的编码方式。多重继承的本质与单继承相同!原创 2023-08-30 14:40:40 · 126 阅读 · 0 评论 -
C++中的抽象类和接口
在现实中需要知道具体的图像类型才能求面积,所以对概念上的 "图形" 求面积是没有意义的!Shape 只是一个概念上的类型,没有具体对象!原创 2023-08-23 16:02:18 · 150 阅读 · 0 评论 -
C++对象模型分析
class 是一种特殊的 struct在内存中 class 依旧可以看作变量的集合class 和 struct 遵循相同的内存对齐原则class 中的成员函数和成员变量是分开存放的。原创 2023-08-23 15:29:34 · 98 阅读 · 0 评论 -
多态的概念和意义
virtual 关键字是 C++ 中支持多态的唯一行为。通过作用域分辨符 (::) 可以访问到父类中的函数。被 virtual 声明的函数被重写后具有多态概念。同样的调用语句在实际运行时有多种不同的表现形态。根据实际的对象类型决定函数调用的具体目标。被 virtual 声明的函数叫做虚函数。根据实际的对象类型判断如何调用重写函数。根据实际的对象类型确定调用的具体函数。父类中被重写的函数依然会继承给子类。子类中重写的函数将覆盖父类中的函数。在程序运行过程中展现出动态的特性。被重写的虚函数可表现出多态的特性。原创 2023-08-23 10:14:36 · 105 阅读 · 0 评论 -
同名覆盖引发的问题
在编译这个函数的时候,编译器不可能知道指针 p 究竟指向了什么。于是,编译器认为最安全的做法是调用父类的 print 函数,因为父类和子类肯定都有相同的 print 函数。编译期间,编译器只能根据指针的类型判断所指向的对象。根据赋值兼容,编译器认为父类指针指向的是父类对象。因此,编译结果只可能是调用父类中定义的同名函数。子类对象可以当作父类对象使用 (赋值兼容)子类对象可以当作父类对象使用 (兼容性)父类指针可以正确的指向子类对象。父类对象可以正确的代表子类对象。子类中可以重写父类中的成员函数。原创 2023-08-23 09:41:10 · 91 阅读 · 0 评论 -
父子间的冲突
通过作用域分辨符 (::) 访问父类中的同名成员。子类中定义的函数是否能重载父类中的同名函数?子类中是否可以定义父类中的同名成员?子类可以定义父类中完全相同的成员函数。子类可以定义父类中完全相同的成员函数。使用作用域分辨符访问父类中的同名成员。子类中的成员将隐藏父类中的同名成员。子类中的成员将隐藏父类中的同名成员。父类中的同名成员依然存在于子类中。子类中的函数将隐藏父类的同名函数。子类无法重载父类中的成员函数。子类可以定义父类中的同名函数。子类可以定义父类的同名成员。类中的成员函数可以进行重载。原创 2023-08-23 09:18:53 · 79 阅读 · 0 评论 -
继承中的构造与析构
子类对象在创建时需要调用父类构造函数进行初始化。子类对象在销毁时需要调用父类析构函数进行清理。先执行父类的构造函数然后执行成员的构造函数。父类构造函数显示调用需要在初始化列表中进行。子类对象在创建时会首先调用父类的构造函数。父类构造函数和子类构造函数有什么关系?先执行父类构造函数再执行子类的构造函数。父类构造函数可以被隐式调用或者显示调用。2、调用成员变量的构造函数。2、执行成员变量的析构函数。析构顺序与构造顺序对称相反。3、调用类自身的构造函数。1、调用父类的构造函数。3、执行父类的析构函数。原创 2023-08-22 17:18:06 · 126 阅读 · 0 评论 -
不同的继承方式
是否可以将继承语句中的 public 改为 protected 或者 private?冒号 (:) 表示继承关系,Parent 表示被继承的类,public 的意义是什么?C++ 中的派生语言只支持一种继承方式 (public 继承)一般而言,C++ 工程项目中只使用 public 继承。C++ 的派生语言只支持 public 的继承方式。一般而言,工程中只使用 public 的继承方式。C++ 中默认的继承方式为 private!C++ 中支持 3 种不同的继承方式。private 继承。原创 2023-07-26 15:49:22 · 96 阅读 · 0 评论 -
继承中的访问级别
子类是否可以直接访问父类的私有成员?面向对象中的访问级别不止是 public 和 private可以定义 protected 访问级别关键字 protected 的意义为什么面向对象中需要 protected ? 面向对象的访问级别不只是 public 和 privateprotected 修饰的成员不能被外界所访问protected 使得子类能够访问父类的成员protected 关键字是为了继承而专门设计的没有 protected 就无法完成真正意义上的代码复用原创 2023-07-26 15:37:53 · 194 阅读 · 0 评论 -
继承的概念和意义
通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能。当前类的对象与成员对象的生命周期相同。将其他类的对象作为当前类的成员使用。子类中可以添加父类没有的方法和属性。子类中可以添加父类没有的方法和属性。继承是面向对象中代码复用的重要手段。子类对象可以直接初始化父类对象。子类拥有父类的所有属性和行为。子类对象可以当作父类对象使用。子类拥有父类的所有属性和行为。子类对象可以当作父类对象使用。子类可以直接赋值给父类对象。子类就是一种特殊的父类。子类就是一个特殊的父类。原创 2023-07-26 15:08:14 · 136 阅读 · 0 评论 -
类型转换函数
工程中以 TypeToType() 的公有成员函数代替类型转换函数。工程中以 TypeToType() 的公有成员函数代替类型转换函数。类型转换函数与转换构造函数具有同等的地位。普通类型与类类型之间能否进行类型转换?类型转换函数用于将类对象转换为其他类型。类型转换函数用于将类对象转换为其他类型。类类型是否能够类型转换到普通类型?类型转换函数可能与转换构造函数冲突。C++ 类中可以定义类型转换函数。类型转换函数 vs 转换构造函数。转换构造函数的参数类型是其他类型。C++ 类中可以定义类型转换函数。原创 2023-07-26 11:21:48 · 165 阅读 · 0 评论 -
前置操作符和后置操作符
重载后置 ++ 操作符需要一个 int 类型的占位参数。对于基础类型,前置 ++ 与后置 ++ 的效率几乎相同。前置 ++ 操作符和后置 ++ 操作符都可以被重载。优化后的二进制程序丢失了 C/C++ 的原生语义。不可能从编译后的二进制程序还原 C/C++ 程序。对于类类型,前置 ++ 的效率高于后置 ++编译优化使得最终的可执行程序更加高效。++ 操作符的重载必须符合其原生语义。如何区分前置 ++ 和后置 ++?重载前置 ++ 符不需要额外的参数。优化使得最终的二进制程序更加高效。原创 2023-07-26 10:48:00 · 123 阅读 · 0 评论 -
逗号操作符的分析
逗号表达式中的前 N - 1 个子表达式可以没有返回值。逗号表达式按照从左向右的顺序计算每个子表达式的值。逗号表达式用于将多个子表达式连接为一个表达式。逗号表达式从左向右顺序计算每个子表达式的值。操作符重载无法完全实现逗号操作符的原生意义。逗号表达式的值为最后一个子表达式的值。在 C++ 中重载逗号操作符是合法的。逗号表达式的值为最后一个子表达式的值。重载函数的参数必须有一个是类类型。重载函数的返回值类型必须是引用。重载后无法从左向右计算表达式。工程开发中不要重载逗号操作符。函数参数的计算次序是不定的。原创 2023-07-24 19:59:45 · 214 阅读 · 0 评论 -
逻辑操作符的陷阱
1、C++ 通过函数调用拓展操作符的功能。通过重载比较操作符代替逻辑操作符重载。通过重载比较操作符替换逻辑操作符重载。操作符重载后无法完全实现原生的语义。直接使用成员函数代替逻辑操作符重载。C++ 从语法上支持逻辑操作符重载。通过专用成员函数替换逻辑操作符重载。实际工程开发中避免重载操作逻辑符。使用全局函数对逻辑操作符进行重载。重载后的逻辑操作符不满足短路法则。3、函数参数的计算次序是不定的。工程开发中不要重载逻辑操作符。重载逻辑操作符有什么意义?逻辑操作符可以重载吗?4、短路法则完全失效。原创 2023-07-11 20:01:56 · 259 阅读 · 0 评论 -
智能指针分析
指针特征操作符 ( -> 和 * ) 可以被重载。重载指针特征操作符 ( -> 和 * )智能指针的意义在于最大程度的避免内存问题。只能用来指向堆空间中的对象或者变量。重载指针特征符能够使用对象代替指针。智能指针只能用于指向堆空间中的内存。C++ 语言中没有垃圾回收的机制。指针无法控制所指堆空间的生命周期。指针生命周期结束时主动释放堆空间。一片堆空间最多只能由一个指针标识。动态申请堆空间,用完后不归还。只能通过类的成员函数重载。杜绝指针运算和指针比较。重载函数不能使用参数。只能定义一个重载函数。原创 2023-07-11 19:49:47 · 139 阅读 · 0 评论 -
经典问题解析三
string 类通过一个成员变量保存当前字符串的长度。C++ 开发时尽量避开 C 语言中惯用的编程思想。string 类通过一个数据空间保存字符数据。在需要进行深拷贝的时候,必须重载赋值操作符。赋值操作符与拷贝构造函数有相同的存在意义。重载赋值操作符,必然需要实现深拷贝!赋值操作符和拷贝构造函数有同等重要的意义。当需要进行深拷贝时必须重载赋值操作符。编译器为每个类默认重载了赋值操作符。编译器是否提供默认的赋值操作?什么时候需要重载赋值操作符?默认的赋值操作符仅完成浅拷贝。原创 2023-07-11 19:38:52 · 93 阅读 · 0 评论 -
函数对象分析
函数调用操作符可以定义不同参数的多个重载函数。函数为全局函数,是唯一的,无法多次独立使用。静态局部变量处于函数内部,外界无法改变。无法具体指定某个具体的数列项作为初始值。函数调用操作符只能通过类的成员函数重载。函数可以获取斐波那契数列每项的值。构造函数指定具体数列项的起始位置。可以定义不同参数的多个重载函数。函数对象用于工程中取代函数指针。该类的对象具备函数调用的行为。多个对象相互独立的求解数列项。函数一旦开始调用就无法重来。函数可以根据需要重复使用。使用具体的类对象取代函数。只能通过类的成员函数重载。原创 2023-07-07 16:41:50 · 119 阅读 · 0 评论 -
数组操作符的重载
string 类对象还具备 C 方式字符串的灵活性吗?可以按照使用 C 字符串的方式使用 string 对象。string 类最大限度的考虑了 C 字符串的兼容性。string 类最大程度的兼容了 C 字符串的用法。数组访问符的重载能够使得对象模拟数组的行为。数组访问符是 C/C++ 中的内置操作符。数组操作符的原生意义是数组访问和指针运算。只能通过类的成员函数重载数组操作符。类的对象怎么支持数组的下标访问?可以定义不同参数的多个重载函数。重载函数能且只能重载一个函数。只能通过类的成员函数重载。原创 2023-07-06 21:33:30 · 175 阅读 · 0 评论 -
C++ 中的字符串类
C 语言不支持自定义类型,因此无法获得字符串类型。在 C++ 中可以通过类完成字符串类型的定义。标准库中提供了相关的类对字符串和数字进行转换。标准库通过 string 类支持字符串的概念。string 类的应用使得问题的求解变得简单。string 类支持字符串和数字的相互转换。C++ 中的原生类型是否包含字符串类型?C++ 语言直接支持 C 语言的所有概念。C++ 中没有直接支持原生的字符串类型。C++ 语言中没有原生的字符串类型。C 语言不支持真正意义上的字符串。原创 2023-06-30 19:28:15 · 343 阅读 · 1 评论 -
初探 C++ 标准库
重载左移操作符,将变量或常量左移到一个对象中!C++ 标准库并不是 C++ 语言的一部分C++ 标准库是由类库和函数库组成的集合C++ 标准库中定义的类和对象都位于 std 命名空间中C++ 标准库的头文件都不带 .h 后缀C++ 标准库涵盖了 C 库的功能 C++ 标准库是由类库和函数库组成的集合C++ 标准库包含经典算法和数据结构的实现C++ 标准库涵盖了 C 库的功能C++ 标准库位于 std 命名空间中原创 2023-06-30 17:33:34 · 200 阅读 · 0 评论 -
完整的复数类
C++ 规定赋值操作符 (=) 只能重载为成员函数。复数中的运算操作可以通过操作符重载实现。操作符重载不能改变原操作符的优先级。操作符重载不能改变操作符的原有语义。操作符重载不能改变操作数的个数。复数的概念可以通过自定义类实现。赋值操作符只能通过成员函数实现。操作符重载的本质为函数定义。统一复数与实数的运算方式。统一复数与实数的比较方式。运算:+,-,*,/求模:modulus。原创 2023-06-30 17:20:12 · 233 阅读 · 0 评论 -
操作符重载的概念
Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确实存在的复数,并且复数在数学中的地位和普通的实数相同。operator 关键字是实现操作符重载的关键。operator 的本质是通过函数重载操作符。操作符重载的本质是通过函数拓展操作符的功能。全局函数和成员函数都可以实现对操作符的重载。编译器优先在成员函数中寻找操作符重载函数。可以将操作符重载函数定义为类的成员函数。C++ 中的重载能够拓展操作符的功能。操作符重载遵循相同的函数重载规则。操作符的重载以函数的方式进行。原创 2023-06-28 17:02:10 · 260 阅读 · 0 评论 -
类中的函数重载
重载能够拓展系统中已经存在的函数功能!全局函数,普通成员函数以及静态成员函数之间是否可以构成重载?无法直接通过函数名得到重载函数的入口地址。函数重载的本质为相互独立的不同函数。1、函数重载的本质为多个不同的函数。3、函数重载必须发生在同一作用域中。全局函数和成员函数不能构成重载关系。函数重载必然发生在同一个作用域中。2、函数名和参数列表是唯一的标识。重载的意义在于拓展已经存在的功能。通过参数列表对函数用法进行提示。通过函数名对函数功能进行提示。拓展系统中以及存在的函数功能。类的成员函数之间可以进行重载。原创 2023-06-28 16:36:27 · 572 阅读 · 0 评论 -
友元的尴尬能力
友元是 C++ 中的一种关系友元发生在函数与类之间或者类与类之间友元关系是单项的,不能传递。原创 2023-06-28 16:22:07 · 85 阅读 · 0 评论 -
二阶构造模式
构造函数只提供自动初始化成员变量的机会不能保证初始化逻辑一定成功执行完 return 语句后,构造函数立即结束半成品对象的概念初始化操作不能按照预期完成而得到的对象半成品对象是合法的 C++ 对象,也是 Bug 的主要来源工程开发中的构造过程可分为资源无关的初始化操作不可能出现异常情况的操作需要使用系统资源的操作可能出现异常情况,如:内存申请,访问文件二阶构造示例class TwoPhaseCons{private: TwoPhaseC原创 2021-12-25 18:15:19 · 55 阅读 · 0 评论 -
类的静态成员函数
静态成员函数是类中特殊的成员函数静态成员函数属于整个类所有可以通过类名直接访问公有静态成员函数可以通过对象名直接访问公有静态成员函数直接通过 static 关键字修饰成员函数。原创 2023-06-28 14:29:32 · 225 阅读 · 0 评论 -
类的静态成员变量
静态成员变量属于整个类所有静态成员变量的生命期不依赖于任何对象可以通过类名直接访问公有静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有静态成员变量。原创 2023-06-28 14:17:46 · 182 阅读 · 0 评论 -
经典问题解析二
类中的函数声明与实际函数定义中都必须带 const 关键字。原创 2023-06-28 13:57:40 · 116 阅读 · 1 评论 -
对象的构造
对象定义:申请对象的空间,并调用构造函数对象声明:告诉编译器存在这样一个对象。原创 2023-06-20 19:57:54 · 215 阅读 · 0 评论 -
神秘的临时对象
下面的程序输出什么?为什么?程序意图:在 Test() 中以 0 作为参数调用 Test(int i)将成员变量 mi 的初始值设置为 0运行结果:成员变量 mi 的值为随机值。原创 2023-06-21 11:18:23 · 224 阅读 · 0 评论 -
对象的销毁
当类中自定义了构造函数,并且构造函数中使用了系统资源 (如:内存申请,文件打开,等),则需要自定义析构函数。原创 2023-06-21 10:55:29 · 84 阅读 · 0 评论 -
对象的构造顺序
C++ 中的类可以定义多个对象,那个对象构造的顺序是怎样的?使用 new 创建对象将自动触发构造函数的调用。堆对象的构造顺序依赖于 new 的使用顺序。当程序执行流到达对象的定义语句时进行构造。当程序执行流到达 new 语句时创建对象。不同的编译器使用不同的规则确定构造顺序。局部对象的构造顺序依赖于程序的执行流。下面程序中的对象构造顺序是什么?下面程序中的对象构造顺序是什么?全局对象的构造顺序是不确定的。对象的构造顺序是不确定的。原创 2023-06-21 10:44:58 · 192 阅读 · 0 评论 -
初始化列表的使用
编译器无法直接得到 const 成员的初始值,因此无法进入符号表成为真正意义上的常量。类中的 const 成员只能在初始化列表中指定初始值。C++ 中提供了初始化列表对成员变量进行初始化。const 成员变量必须在初始化列表中指定初值。成员的初始化顺序与初始化列表中的位置无关。类中的 const 成员的本质是只读变量。类中的 const 成员会被分配空间的。类中可以使用初始化列表对成员进行初始化。类中是否可以定义 const 成员?成员的初始化顺序与成员的声明顺序相同。类中可以定义 const 成员变量。原创 2023-06-21 09:57:22 · 173 阅读 · 0 评论 -
类的真正形态
经过不停地改进,结构体 struct 变得越来越不像它在 C 语言中的样子了!在用 struct 定义类时,所有成员的默认访问级别为 public。在用 class 定义类时,所有成员的默认访问级别为 private。struct 在 C 语言中已经有了自己的含义,必须继续兼容。在 C++ 中提供了新的关键字 class 用于类定义。class 和 struct 的用法是完全相同的。原创 2023-06-19 20:07:02 · 178 阅读 · 0 评论 -
类与封装的概念
类通常分为以下两个部分类的实现细节类的使用方式当使用类时,不需要关心其实现细节当创建类时,才需要考虑其内部实现细节。原创 2023-06-19 10:47:06 · 185 阅读 · 0 评论