|
最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用:
1: #include
2: 3: class Test 4: { 5: public: 6: int m_a; 7: 8: Test(int a) 9: { 10: m_a = a; 11: } 12: 13: Test() 14: { 15: Test(1); 16: } 17: }; 18: 19: int main(int argc,char* argv[]) 20: { 21: Test var; 22: std::cout<<var.m_a<<std::endl; 23: return 0; 24: } 这段代码输出的是一个不确定的值,m_a的值并不是1,原因在于执行Test(1)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。
那么如何在C++中实现构造函数调用构造函数呢?
这里需要说明一下new的另一种new的表达式----定位new表达式(placement new),它的作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。 STL中的原型如下:
1: void * operator new (size_t, const std::nothrow_t &) throw();
2: void * operator new (size_t, void *) throw(); 3: void * operator new[] (size_t, const std::nothrow_t &) throw(); 4: void * operator new[] (size_t, void *) throw();该表达式的形式如下:
1: new (place_address) type2: new (place_address) type (initializer-list)其中place_address必须是一个指针,而intializer-list提供了(可能为空的)初始化立 标,以便在构造新分配的对象时使用。
对于上面的例子,我们可以使用定位new表达式来完成构造函数之间的调用:
1: Test()
2: { 3: new (this) Test(1); 4: }最后,对于构造函数相互调用的问题,可以考虑一下两点建议: 1)可以考虑使用构造函数的默认参数来减少这种调用方式。 2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可。
附:C#中构造函数相互调用的例子
1: public class Base
2: { 3: int _a; 4: int _b; 5: 6: public Base() 7: { 8: _b = 2; 9: } 10: 11: public Base(int a) :this() 12: { 13: _a = a;1 4: } 15: } 简单一点说就是this(params)语句 |
相关推荐
c++ 构造函数constructor /复制构造函数copy constructor
构造函数:每个类都分别定义了他的对象被初始化的方式,类通过一个或几个特殊的成员函数(member function)来控制其对象的初始化过程,这些函数叫做构造函数。 构造函数的任务是初始化类对象的数据成员(data member),一般就是private里定义的data member。 以下引用https://blog.youkuaiyun.com/onlyongwang/article/details/80...
C++中构造函数调用构造函数
最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用: 1: #include 3: class Test 4: { 5: public: 6: int m_a; 8: Test(int a) 9: { 10: m_a = a; 1...
深究拷贝构造函数(Copy Constructor)和重载的赋值运算符(Copy Assignment Operator)
定义:拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,并将已有对象的成员逐一复制到新对象中。语法示例public:// 拷贝构造函数声明方面拷贝构造函数赋值运算符调用时机对象的初始化(创建新对象时)已存在对象的赋值操作对象状态创建新对象并初始化其状态修改已存在对象的状态函数签名内存管理分配新内存(如果需要)可能需要释放已有内存并重新分配(如果需要)自赋值处理不适用(因为是初始化新对象)需要检查自赋值并妥善处理使用场景创建新对象、按值传递参数、按值返回对象对已存在对象进行赋值操作。
C++学习笔记-----在一个构造函数中调用另一个构造函数
在构造函数中调用另一个构造函数如果一不注意就会有无限递归的危险,而且构造函数的参数的不同也决定了调用的不同,所以特意总结了一下哪些形式的调用时允许的: 首先假设构造函数调用时参数都是外部的变量,而不是一个常量。 第一种,也是C++11支持的一种调用方式。在函数的初始化列表中调用另一个构造函数: int b = 2; class Test { public: Test() : Test(b)
深入解析SAP F4帮助函数F4IF_INT_TABLE_VALUE_REQUEST的回调机制
本文深入解析了SAP ABAP开发中F4IF_INT_TABLE_VALUE_REQUEST函数的回调机制。通过剖析其工作原理与核心参数,详细阐述了如何利用回调函数实现F4帮助的多值返回、动态数据过滤及选择后校验等高级定制功能,并提供了实用的代码示例与调试技巧,帮助开发者高效应对复杂的屏幕交互需求。
【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二
【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二
C++——构造函数(定义以及调用构造函数的过程)
构造的特殊的成员函数,函数名和类名相同,无返回类型,可以带参数(说明构造函数可以重载)
【scp】Windows 下scp报错 bad permissions
Windows 下使用 SSH 连接报 Bad owner or permissions on C:\\Users\\Administrator/.ssh/config 错误问题解决 C:\Users\Administrator>scp -P 66666 D:\1111.pdf zzd@58.213.45.xx:/home/zzd/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING:...
c++ 拷贝构造函数_C++构造函数总结
最近在找工作,比较忙,所以没有时间写文章了。找了一段时间了,还是没有什么收获。找工作给我一个最大的体会就是"基础要扎实,代码能力要强(这里的代码不是指那种业务逻辑的代码哦)"。01 文章概要 这篇文章总结一下C++中的构造函数,然后自己实现一个MyString类,实现对MyString字符串的输入和输出。如果对C++熟悉的童鞋应该就能猜到后面要介绍的知识了: C++的构造函数(分的细就是6种,粗一...
数据库实验报告--MySQL
数据库完整版报告--MySQL 包括数据库创建、表的创建、视图以及授权和触发器的创建等内容,全是精华!看完点赞加收藏O(∩_∩)O~。
CycloneDDS(C++版本)开源代码在Linux(X86平台)系统上编译生成可执行文件的详细步骤
cyclonedds里面已经有现成的实例供我们参考,在根目录下的example目录下面,我们打开此目录,此目录下有CMakeLists.txt文件以及一些其他的文档,我们需要在此目录(example目录)下编译构建出。我们可以看到cyclonedds-cxx-master包下的example目录下有很多文件,包括CMakeLists.txt等,其中我们要构建的可执行文件所需要的源文件等就在。此过程会稍微慢一点。之后会报错,如下:(图片中是c版本出现的问题截图,不影响,c++也是这个影响,问题是一样的)
C++中的构造函数重载(Constructor Overloading):定义、用途与实现
构造函数重载是指在同一个类中定义多个构造函数,这些构造函数具有相同的名称(即类名)但参数列表不同(参数数量、类型或顺序不同)。C++编译器根据调用时传递的参数数量和类型来决定使用哪一个构造函数。构造函数重载是C++面向对象编程中的一个强大特性,允许类根据不同的输入参数提供多种初始化方式。这不仅增强了类的灵活性和可用性,还提高了代码的可读性和维护性。在设计类时,合理利用构造函数重载,可以使类更适应多变的应用场景,满足不同的使用需求。
【Matlab】刃边法计算mtf
摘要:刃边法是一种测量光学系统调制传输函数(MTF)的常用方法。本文介绍了基于Matlab的MTF计算实现方案,包括图像灰度化、梯度计算、刀口方向选择、梯度投影等关键步骤,并给出了完整的代码实现。该方案可通过添加图像预处理、多方向计算、函数封装等方式进行扩展,提高MTF计算的准确性和实用性,适用于不同应用场景的光学系统性能评估需求。(148字)
Constructor Overloading in C++ - C++ 中的构造方法重载
Constructor Overloading in C++ - C++ 中的构造方法重载 1. Constructor Overloading in C++ Suppose we have a Student class and while making its object, we want to pass a name of it and if nothing is passed then the name should be unknown. And yes! we can do this by h
ProgLoss+STAL 技术详解:YOLO26 小目标检测增强方案
本文提出了一种基于ProgLoss渐进式损失函数和STAL小目标感知标签分配的YOLO26增强方案。针对小目标检测中特征信息少、正负样本不平衡等难题,STAL通过尺度感知的标签分配策略动态调整候选样本数量和IoU阈值,为小目标分配更多正样本;ProgLoss则根据训练阶段动态调整分类和回归损失的权重,早期侧重定位能力,后期加强分类精度。实验表明,该组合方案显著提升了小目标检测性能,在COCO数据集上小目标AP达到38.2%,比基线提升6.5个百分点。该方法为遥感、监控等场景的小目标检测提供了有效解决方案。
IPv6之001-IPv6是什么
技术本质:IPv6(Internet Protocol version 6)是互联网工程任务组(IETF)设计的网络层核心协议,用于替代IPv4核心使命:解决IPv4地址枯竭问题,重构互联网基础架构,支撑万物互联时代革命性特征fill:#333;color:#333;color:#333;fill:none;IPv6128位地址空间无状态自动配置原生IPsec加密协议头部精简。
C++中重载构造函数的互相调用初始化成员变量的问题
文章目录C++中重载构造函数的互相调用初始化成员变量的问题不能直接互相调用的重载构造函数使用一个private的函数初始化成员变量使用带有默认参数的构造函数使用placement new运算符调用重载构造函数使用C++11的委托构造函数(在初始化列表位置调用) C++中重载构造函数的互相调用初始化成员变量的问题 写一个类的时候,我们可能会希望有多重不同的初始化方式,此时就用到了重载构造函数。例如:...
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
拷贝构造函数(copy constructor)和赋值重载(overloading assignment)
1.只有单个形参,并且该形参是对类类型的引用,并且一般都是由const去修饰,为了防止被替他人去修改,如果有额外的参数要由默认值,However, it is not usually used like this2.拷贝构造函数也是特殊的成员函数,是构造函数的一个重载形式3.拷贝构造函数如果用传值传参的话会直接报错,因为拷贝构造函数用传值传参会调用新的拷贝构造函数,会形成无穷递归4.当然,如果未显示定义,编译器会自动生成拷贝构造函数,不过都是浅拷贝, 或者说是值拷贝。
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
C/C++基础 -- 构造函数 constructor
C/C++基础 -- 构造函数 constructor1、什么是构造函数2、构造函数的定义2.1、定义构造函数2.2、关于构造函数的说明2.3、构造函数初始化列表3、构造函数的重载4、带默认参数的构造函数关于构造函数默认参数的说明 本博文由 西北工业大学MOOC 总结而来,以备以后回顾。(侵删) 1、什么是构造函数 我们在建立一个对象时,通常需要立即对这个对象进行初始化,如对数据成员的赋值...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
Typescript高级: 函数重载和constructor重载
在 TypeScript 中,类的重载主要涉及到方法的重载(Overloading),而很少涉及构造函数的重载因为 TypeScript 的类构造函数不支持像一些其他语言(如 C++ 或 Java)那样的传统意义上的重载类的构造函数(constructor)本身并不支持传统意义上的重载,因为构造函数只有一个实际的实现但是,可以通过为构造函数提供不同的参数类型或数量来模拟构造函数的重载效果这通常是通过使用联合类型(union types)和类型守卫(type guards)来实现的。
Cpp基礎:Constructor 各類構造函數
Cpp 基礎:Constructor 各類構造函數 文章目錄Cpp 基礎:Constructor 各類構造函數簡介參考正文1. 無參數構造函數2. 有參數構造函數(配合初始化列表)3. 拷貝構造函數4. 賦值運算符重載(對象賦值)5. 析構函數6. 輸出運算符重載(輸出對象)結語 簡介 C++ 相較於 Java 來說,對對象(object)的控管能力有更上一層樓了,有基本的構造函數(Constructor)、析構函數(Destructor),並且提供 new、delete 關鍵字來管理堆上對象的存活,這比
java的constructor怎么用,constructor函数 Java中的构造函数Constructor怎么用
Java中的构造函数Constructor怎么用注意: 由于Java不允许像C++那样为函数的参数提供缺省值,因此在构造函数中也不能使用缺省值. 构造函数的特点: 1.它的函数名与类名相同; 2.它可以重载; 3.不能指定返回类型,即使是void也不行; 4.虽然在一般情况下,构造函数不被显式调用。Java中的构造函数Constructor怎么用?C++里的constructor是什么,怎么用?时...
CRITICAL SKILL 9.1: Overloading Constructors 构造函数的重载
This module continues thediscussion of the class begun in Module 8. It examines a number ofclass-related topics, including overloading const
c语言 自动构造函数,C++构造函数(Constructor)
在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。在《C++类成员的访问权限》一节中,我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点麻烦。有了构造函数,...
下标也能重载?proposal-operator-overloading 中 [] 与 []= 的魔法实现与 5 个实战案例
说起 JavaScript 运算符重载,很多开发者第一反应是"JS 不是不支持吗?"没错,原生 JavaScript 确实不支持 `+`、`*` 这些运算符的自定义行为,但由 TC39 提出的 **proposal-operator-overloading 提案**,为 JavaScript 带来了完整的运算符重载能力——更惊艳的是,它连 `[]` 下标访问和 `[]=` 下标赋值都可以重载。今天
C++构造函数重载:原理、实现与最佳实践详解
在面向对象编程中,构造函数是对象初始化的核心机制,负责为新生对象分配资源并设置初始状态。其基本原理是通过与类同名的特殊成员函数,在对象创建时自动调用,完成内存分配和成员初始化。这一机制的技术价值在于保证了对象的有效性和一致性,是封装和数据隐藏的基石。在实际应用场景中,对象往往需要以多种形态被创建,例如根据不同的参数组合进行初始化,这就需要借助构造函数重载技术。构造函数重载作为函数重载在构造函数上的应用,允许在同一个类中定义多个同名构造函数,通过不同的参数列表来区分,编译器根据调用时提供的实参进行重载决议,自
1698



被折叠的 条评论
为什么被折叠?



