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

构造函数转换_构造函数实例化对象

转载博客: http://blog.csdn.net/thefutureisour/article/details/7705771 构造函数转换 构造函数会引起一个不引人注意的问题: 用单个实参来调用的构造函数定义了从从形参类型到类类型的一个转换...); 这是因为Sales_item的构造函数可以是带单个实参的(也可以不带实参,因为我定义了默认实参7115145547),这时在调用trans1.same_isbn(null_book);时,就会发生类型转化...为了避免这个情况的发生,可以将类的构造函数声明为explicit: explicit Sales_item(const std::string &book = "7115145547"):isbn(book...所以对于单形参构造函数,除非有非常明显的理由让他发生类型转换,否者我们应该把它设计为explicit,防止转化的发生。...当然我们总可以为转化而显示的使用构造函数: trans1.same_isbn(Sales_item(null_book)); 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

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

C++核心准则C.90:依靠构造函数赋值运算符不是内存初始化和内存拷贝‍

C.90: Rely on constructors and assignment operators, not memset and memcpy C.90:依靠构造函数赋值运算符不是内存初始化和内存拷贝‍...标准C++机制通过调用构造函数构造某个类型的实例。正如C.41说明的:构造函数应该生成一个完全初始化的对象。不应该要求额外的初始化,例如使用memcpy。...类型应该提供一个拷贝构造函数和/或者拷贝复制运算符以便适当地生成类的拷贝并维持类的不变量。使用memcpy拷贝一个非平常可拷贝类型的行为没有定义。通常会导致断层或者数据破坏。...这个函数类型不安全而且会覆盖虚函数表。...这个函数同样是类型不安全而且覆盖虚函数表。

95320

【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数赋值运算符重载

注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数 2 析构函数 析构函数构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的...拷贝构造函数典型调用场景: 使用已存在对象创建新对象 函数参数类型为类类型对象 函数返回值类型为类类型对象 4 赋值运算符重载 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数...赋值运算符只能重载成类的成员函数不能重载成全局函数 原因:赋值运算符如果不显实现,编译器会生成一个默认的。...此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数 用户没有显实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝...注意:内置类型成员变量是直接赋值的,自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。 既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了 还需要自己实现吗?

13710

C++类的复制构造函数赋值运算符

前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...,系统会自动的提供:     (1)构造函数     (2)析构函数     (3)地址运算符     (4)赋值构造函数     (5)赋值运算符     其中(1)-(3)在编程中不会产生什么影响,...当同时满足以下两个条件的时候就会自动调用复制构造函数:     (1)新建一个对象;     (2)使用同类中现有对象初始化新对象。    ...由于默认复制构造函数中没有num++,不管用那个构造函数构造出的对象调用的都是同一个析构函数析构函数中含有num--,所以临时对象导致num多减了一次,所以最后一句话会出现,“析构后对象的个数是-...当将已有的对象赋给另一个对象时,将使用赋值运算符。 3、默认复制运算符做了什么事情?    其实它和默认的赋值构造函数差不多,都是进行浅复制。

1.1K70

【C++】拷贝构造函数赋值运算符重载详解

函数名也与类名相同,第一个参数是的this,第二个参数是被拷贝的对象,如果我们自己实现了拷贝构造函数,也要自己实现一个构造函数,否则会报错,如图:) 拷贝构造函数的参数只有一个且必须是类类型对象的引用...,返回时根据实际场景,能用引用 尽量使用引用 ⭐赋值运算符重载 ⭐运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表...this指针传递的,不需要写出来) 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this..._day; } //这里有返回值才能符合连续赋值 //如果返回的不是引用,则还会调用拷贝构造创建一个对象,返回的是一个新的对象副本。...用户没有显实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。 注意:内置类型成员变量是直接赋值的,自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值

13810

C++ explicit禁止单参数构造函数调用

1.单参数构造函数调用 C++中单参数构造函数是可以被调用的,主要有两种情形会调用单参数构造函数: (1)同类型对象的拷贝构造;即用相同类型的其它对象来初始化当前对象。...(2)不同类型对象的转换。即其它类型对象调用单参数拷贝构造函数初始化当前对象。比如A a=1;就是转换,不是显示调用构造函数,即A a(1);。...; 这种单参数构造函数调用在C++中是被默许的,但是这种写法很明显会影响代码的可读性,有时甚至会导致程序出现意外的错误。...2.单参数构造函数调用的危害 单参数构造函数调用不仅仅会给代码可读性造成影响,有时会带来意外的结果。...3.explicit禁止单参数构造函数调用 在没有合适理由必须使用转换的前提下,为了提高代码可读性以及避免单参数构造函数调用带来的潜在风险,建议使用explicit关键字阻止单参数构造函数调用

4.6K60

【C++】构造函数意义 ( 构造函数显式调用与调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

类的 实例对象时 , C++ 编译器 会自动调用 开发者定义的 构造函数 ; 2、构造函数显式调用与调用 类 的 构造函数 可以 自动调用 , 也可以手动调用 ; 一般 默认的 无参构造函数 是 自动地...调用 ; 有参构造函数 是 由开发者 手动显调用 ; 3、构造函数替代方案 - 初始化函数 构造函数的替代方案 - 初始化函数 : 共有初始化函数 : 为每个类定义一个 public 共有初始化函数..., 并且是 显调用 , 操作起来比较繁琐 ; 操作遗漏 : 使用 初始化函数 对 实例对象 进行初始化操作 , 不能有遗漏 , 如果 实例对象 没有进行初始化 , 其中的成员变量值 是随机值 , 不确定..., 造成未知风险 ; 无法调用 : 在某些特殊场合 , 初始化函数是无法被调用到的 , 如 : 只定义类的变量类型 , 没有调用构造函数 , 此时会自动调用无参构造函数初始化实例对象 , 如果使用初始化函数...; 默认拷贝构造函数 : 如果 类 中没有定义 拷贝构造函数 , C++ 编译器 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用

39220

【云+社区年度征文】C++ 拷贝构造函数赋值运算符

拷贝构造函数 首先拷贝构造函数是一个“构造函数”,函数名与类名相同,没有返回值。形参是本类对象的引用。函数作用是创建一个新对象,本类对象的引用是用来初始化新创建的对象。...使用一个对象给另一个对象初始化。有一下两种语法: 类名 对象2(对象1)。例如:“A obj2(obj1);” 类名 对象2 = 对象1。...例如:“A obj2 = obj1;” 赋值运算符 赋值运算符是用来给对象赋值的,前提是,已经创建好对象了。...函数定义: //返回值必须为引用,如果写成对象,符合上面调用拷贝构造函数场景2,对象作为函数返回值的情况,就会调用拷//贝构造函数拷贝构造函数中有“ = ”,再次调用赋值运算符,最终造成循环调用,程序崩溃...调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生,如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符

53110

C++拾趣——类构造函数转换

首先我们看下一种比较常见的技术——类构造函数转换。这儿先说明下,之后的例子中,我会为了尽量突出主要内容,忽略一些可以作为充分条件但非必要条件的东西,故设计的一些代码存在“不完善”的嫌疑。...其效果和使用int_proxy控制住是一样的。这是为什么呢?这便是类构造函数转换技术。...C++编译器认为test_int_proxy方法传入的应该是一个const类型的int_proxy对象,然而如果它发现参数不是该对象时,就会使用该类中可以使用该参数进行构造对象的方法构造出一个临时的对象...稍微总结下类构造函数转换的必要条件: 找不到传参类型严格对应的函数 找到传参类型严格匹配的类的构造函数 因为转换构造出的是临时对象,所以不可修改,故触发转换的函数的传参类型必须要使用const..._m(n) {};         这样通过转换构造临时对象的图谋将会被察觉并禁止。

66620

原型模式C++类的复制构造函数赋值运算符

这个可以从两个角度来说,第一,时间消耗角度:如果创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,这时如果需要一个跟刚刚实例化对象参数差不多的实例(可以完全相同,也可以大部分相同)那么直接使用... new 来创建这样一个实例就显得太昂贵了,如果使用原型模式克隆一个一模一样的实例(或者先克隆一个一模一样的实例,然后做小部分的改动)就显得非常的合理。...假设要通过一个类实例化一各班同学的毕业信息,那么会有大量雷同的信息,这时如果要用new实例化,就需new很多次,更悲剧的是如果所有同学的信息都录入完毕,突然发现某个参数的信息录入错了,这时要对每一个实例分别进行修改,如果使用原型模式克隆就不会出现这个问题...因为类之间直接赋值的话,默认的拷贝函数是进行引用赋值的 对于指针的浅复制会造糟糕的结果,这点可以参见C++ primer plus "类和动态内存分配"章节,也可以参见我的另一篇技术博客 C++类的复制构造函数赋值运算符...,需要供继承者自行实现 15 //为了测试添加的函数 16 virtual void show()=0; 17 }; 18 19 // 派生自Prototype,实现Clone

1.4K50

【C++初阶】类与对象:6大默认成员函数------拷贝构造赋值运算符重载

如果你的拷贝构造函数的形参不是引用,那么在传参的过程中,就会发生实参的拷贝,就又会去调用拷贝构造函数,如此往复,就形成了无穷递归,当然,编译器也不会让你传值的,它会直接报错: 3....若未显定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。... ,这就会崩溃,所以当有动态申请的资源时,要自己写拷贝构造函数; C.使用场景 1.使用已存在对象初始化新对象; class Date { public: Date(int year = 23, int...,那么会自动生成的赋值运算符重载,这和拷贝构造函数类似: 1.对内置类型完成浅拷贝; 2.对自定义类型会去调用它的赋值运算符重载函数 下面是日期类的赋值运算符重载: Date& operator...四.区分拷贝构造赋值运算符重载 1.当我们用一个已经存在对象去初始化另一个对象时,即使写的是 “ = ” ,此时也调用它的拷贝构造函数; 2.已经存在的两个对象之间赋值拷贝,此时是赋值运算符重载;

11210

什么是三法则

复制构造函数赋值运算符有什么区别? 什么时候需要声明定义它们? 怎么禁止对象被复制?...一是person b(a),调用复制构造函数,在已存在对象的基础上再构造一个对象;二是b = a,调用赋值运算符, 在上述的代码中,我们既没有定义复制构造函数,也没有定义赋值运算符(也没有定义析构函数)...可以引用标准中的一段话: …复制构造函数赋值运算符和析构函数都是特殊成员函数。如果程序没有显示声明并定义,它们会被生成。...对一个不包含联合体的类,生成的复制构造函数在执行的时候,会按成员对象依次复制。...生成的析构函数为空,在这个例子中也恰当,因为构造函数中并没有定义任何需手动管理的资源。

56720

从零开始学C++之构造函数与析构函数(一):构造函数、析构函数赋值与初始化、explicit关键字

(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,一般被地调用。...三、转换构造函数 单个参数的构造函数不一定是转换构造函数 将其它类型转换为类类型 类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型转换为类类型 #include ...四、赋值与初始化的区别 在初始化语句中的等号不是运算符。...第一条语句是初始化,后面是赋值操作,参照上面临时对象的创建销毁,赋值运算符的调用可以理解输出。 五、explicit 关键字 只提供给类的构造函数使用的关键字。...编译器不会把声明为explicit的构造函数用于转换,它只能在程序代码中显示创建对象 假设在Test 类的构造函数Test(int num); 前面加上explicit 关键字,那么Test t =

1.2K00

【JavaScript】数据类型转换 ② ( 字符类型 转为 数据类型 | parseInt() parseFloat() 函数 | Number() 函数 | 运算符转换 )

一、 字符类型 转为 数据类型 将 数据 转为 数字类型 有 如下 四种方法 , 使用 parseInt() 和 parseFloat() 函数 是 最常用的两种方法 , 需要重点掌握 ; parseInt...() 函数 : 调用 Number() 强制转换函数 , 将 string 字符串类型 转为 number 数字类型 ; 转换 : 字符串 进行算术运算时 , JavaScript 会尝试将 操作数...); console.log(notANum) // 输出 : NaN 展示效果 : 3、运算符转换...在对 string 字符串类型 进行 算术运算时 , JavaScript 会 尝试 将 操作数转换为数字 ; 算术运算符 - , * , / 会有 转换 , 在 字符串前面 单独使用 + ( 加号前面不能有元素...) 也会有 转换 ; 下面的 减 0 算术运算操作 , 会 尝试将 字符串转换为数字 ; let str = "5"; // 减 0 算术运算操作 会 尝试将 字符串转换为数字 let num

4720

C++类自动提供的特殊成员函数

复制构造函数是按值进⾏复制的。...- 复制构造函数的功能相当于: ```c++ sailor.str=sport.str; //复制的是指向字符串的指针,不是字符串本身。...实现时也可能分两步来处理这条语句: 使⽤复制构造函数创建⼀个临时对象,然后通过赋值将临时对象的值复制到新对象中。 初始化总是会调⽤复制构造函数, ⽽使⽤=运算符时也可能调⽤赋值运算符。...赋值运算符实现也对成员进⾏逐个复制。...通过返回⼀个对象,函数可以像常规赋值操作那样,连续进⾏赋 值,即如果S0、S1和S2都是StringBad对象,则可以编写这样的代码: S0=S1=S2; //使用函数表示法时,转换为;

67810

C++打怪升级(五)- 类和对象入门2

一个类中没有写任何成员函数时编译器会自动生成默认成员函数。 默认成员函数是我们设计类时没有显实现,编译器自动生成的成员函数。 默认成员函数对于我们来说是的、不可见的,但确实是存在的。...---- 对默认拷贝构造函数的分析 如果我们没有显定义拷贝构造函数,编译器会生成的默认的拷贝构造函数。 那么默认的拷贝构造函数到底做了什么事呢?...,如果我们在类内没有显实现它,那么编译器就会自动的实现默认的赋值运算符重载函数。...,但是,默认成员函数比如默认赋值运算符重载函数就是满足队列类的需求的: 两个队列对象q1,q2,q1向q2赋值时会自动调用q1的默认赋值运算符重载函数不是拷贝构造,q1的默认赋值运算符重载函数在调用自定义类型成员自己的赋值运算符重载函数完成对应的赋值操作...当我们必须要显的写析构函数时,那么就一定需要显的写拷贝构造赋值运算符重载; 当我们不比显的写析构函数时,就不比显的写拷贝构造赋值运算符重载; 这里的资源管理一般有动态申请的空间、文件打开和关闭等

71020
领券