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

c++类的构造函数不显式声明会自动生成吗

说明一下,我用的是g++7.1.0编译器,标准库源代码也是这个版本的。 本篇文章讲解c++11中,类的构造函数种类,以及不显式声明的情况下是否会自动生成。 1....构造函数默认生成规则 2.1 没有显式声明任何构造函数 编译器会自动生成默认的无参构造函数,这一点我们是可以肯定的,那另外几种构造函数也会默认生成吗,这个就不太确定了。...,编译器除了默认生成无参构造函数以外,还会自动生成拷贝构造函数、赋值构造函数、移动构造函数、移动赋值构造函数,并且自动生成的构造函数都是public的,因为它们是可以用于生成对象的,而对于有参构造函数,...因为参数是未知的,所以编译器没有办法自动生成。...任何情况下都不会自动生成; 显式声明普通构造函数时,会自动生成拷贝构造函数、赋值构造函数、移动构造函数、移动赋值构造函数四种; 只显式声明拷贝构造函数时,普通构造函数都不会自动生成,没有办法生成对象;

1.2K20

箭头函数与普通函数(function)的区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么?

基本不同 1.写法不同,箭头函数使用箭头定义,普通函数中没有 .箭头函数都是匿名函数,普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。...在普通函数中,this总是指向调用它的对象,如果用作构造函数,this指向创建的对象实例。箭头函数中没有this,声明时捕获其所在上下文的this供自己使用。...所以箭头函数结合call(),apply()方法调用一个函数时,只传入一个参数对this没有影响。...obj x fn1.apply(obj); // obj x fn2.call(obj); // window x fn2.apply(obj); // window x 4.箭头函数不可以做构造函数...arguments,取而代之用rest参数…解决 6.箭头函数不可做Generator函数

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

    类与对象(中(1))

    并不是,任何类在什么都不写时,编译器会自动生成如上图中的6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。...---构造函数 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。...如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...,代码可以通过编译,因为编译器生成了一个无参的默认构造函数 // 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成 // 无参构造函数,放开后报错:error...无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

    7110

    C++(类和对象)

    this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递 构造函数和析构函数 构造函数和析构函数属于六个默认成员函数的其中一个。...构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。...特性:构造函数虽然名字是构造,但是原本的意思是对成员变量进行初始化。 特性: 函数名与类名相同。 无返回值。 对象实例化时编译器自动调用对应的构造函数。 构造函数可以重载。...如果类中没有显式写出构造函数,则编译器会自动生成一个构造函数,如果编译器中有了显式写出了构造函数则编译器就不会生成构造函数了。...,代码可以通过编译,因为编译器生成了一个无参的默认构造函 数 // 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再 生成 // 无参构造函数,放开后报错

    9310

    类和对象(2)

    构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象由编译器自动调用,以保证每个成员都有一个合适的初始值,并且在对象整个声明周期只调用一次。...1 函数名与类名相同 2 无返回值(返回值什么都不需要给,也不需要void) 3 对象实例化时编译器自动调用对应的构造函数 4 构造函数可以重载(同一个类中,可以定义多个构造函数,只要它们的参数列表不同即可...Date d3(); } 5 如果类中没有显式定义构造函数,那么在c++中编译器会自动生成一个无参的默认构造函数,用户如果显式定义,则编译器不再自动生成。...5 跟构造函数类似,我们不写编译器自动生成的析构函数对内置成员不做处理,自定义成员会调用他的析构函数 6 后定义的先析构(和栈一样,后进先出) 7如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数...拷贝构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

    9410

    C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点

    x + y; } private: int a; //成员变量 }; 而默认成员函数就是不用写,编译器会自动生成的函数,比如上面写的Add函数如果为默认生成函数,那么我们可以不进行声明定义,...它还是封装在类中的 2、因为我们要实现在创建类变量的同时进行初始化,所以构造函数的名字与类名相同 3、构造函数可以是半缺省或者全缺省的 4、一个类中只能有一个构造函数,一旦自己写了编译器就不会生成默认构造函数...构造函数在类中实际上是可以自动生成的,当我们不去写默认构造函数时,它就会在类中自动生成,但我们需要注意的是,默认生成的构造函数是无参的,且它会初始化一个随机值 例如: class Date {...,但是通过运行结果我们可以发现编译器自动调用了析构函数 3、拷贝构造函数 3.1 拷贝构造函数的作用 顾名思义,拷贝构造函数的作用就是将一个已经构造好的函数拷贝给另一个函数, 拷贝构造函数只有单个形参...,该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) ,在用 已存 在的类类型对象创建新对象时由编译器自动调用 。

    9610

    C++ —— 关于类和对象(中)

    1.类的默认成员函数 默认成员函数就是用户没有写,编译器会自动生成的成员函数称为默认成员函数 一般默认生成以下6个默认成员函数: 2....如果类中没有显式定义构造函数,则C++编译器会自动生成⼀个无参的默认构造函数,⼀旦用户显式定义编译器将不再⽣成 6....MyQueue且Stack有默认构造时,MyQueue自动生成就可以用。...如果没有显式定义拷⻉构造,编译器会⽣成自动生成拷⻉构造函数 自动生成的拷⻉构造对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的拷⻉构造 5....const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。

    5710

    (超清晰)C++ 类和对象(B)

    一、类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。...如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再生成。...对象生命周期结束时,系统会自动调用析构函数。 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构函数。...像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的拷贝构造就可以完成需要的拷贝,所以不需要我们显示实现拷贝构造。...0; } 2、取地址运算符重载 取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。

    3500

    类的构造函数和析构函数

    构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再使用的时候,需要清理资源的时候调用。...ct4(ct1); ClassTest ct5 = ClassTest(); 那么以上五种方式类的初始化,又是什么初始化呢,以及调用了哪些构造函数呢?...上代码: 上述代码中,将复制构造函数delete了,所以初始化需要调用复制构造函数就会报错,因此我们验证有哪些初始化报错了即可。下面是编译器中报错提示。大概意思就是复制构造函数被删除了。...主要是因为复制构造函数是可以由编译默认合成的,而且是公有的(public),编译器就是根据这个特性来对代码进行优化的。...然而如里你自己定义这个复制构造函数,编译则不会自动生成,虽然编译不会自动生成,但是如果你自己定义的复制构造函数仍是公有的话,编译还是会为你做同样的优化。

    1.9K20

    C++:类和对象(上)

    ,编译器会自动生成的成员函数。...如果我们没有写构造函数,编译器会自动生成一个无参数的默认构造函数,我们写了就不会生成。 3.默认构造函数:无参构造函数,全缺省构造函数,不写时编译器生成的构造函数都叫默认构造函数。...3.如果没有显示写拷贝构造函数,编译器会自动生成拷贝构造函数。自动生成的拷贝构造对内置类型成员变量完成浅拷贝,对自定义类型成员变量会调用它的拷贝构造函数。...1.析构函数在类名前加~,无参数无返回值(跟构造类似,不加void)。 2.一个类只能有一个构造函数,在对象生命周期结束后会自动调用,若我们没有写析构,编译器会自动生成。...所以无论如何,类里都有赋值重载函数(编译器生成的或者我们显示写的)。 2.编译器自动生成的赋值重载函数对内置类型成员变量进行浅拷贝(一个字节一个字节的拷贝),对自定义类型会调用它的拷贝构造函数。

    11410

    类和对象(中)

    对象实例化时系统会自动调用对应的构造函数。 4. 构造函数可以重载。  5. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦用户显示定义编译器将不再生成。...(注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。) 7....对象⽣命周期结束时,系统会自动调⽤析构函数。 5. 跟构造函数类似,我们不写编译器⾃动生成的析构函数对内置类型成员不做处理,⾃定类型成员会调⽤他的析构函数。 6....像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动⽣成的拷贝构造就可以完成需要的拷⻉,所以不需要我们显示实现拷贝构造。...0; } 取地址运算符重载  取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。

    8210

    类和对象详解

    4.构造方法 4.1概念 构造方法(构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。.../ 名字与类名相同,没有返回值类型,设置为void也不行 // 一般情况下使用public修饰 // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 public...,并不负责开辟空间 4.2特性 名字必须与类名相同 没有返回值类型,设置void也不行 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法...:名字相同,参数列表不同,因此构成了方法重载, 5.如果说用户没有显示定义,编译器会生成一份默认的构造方法,生成默认构造方法一定是无参的。...,编译器会默认生成一个不带参数的构造方法。

    9610

    【C++类和对象(中)】—— 我与C++的不解之缘(四)

    4、构造函数可以重载 5、如果类没有显示定义构造函数,C++编译器会自动生成一个无参的默认构造函数;如果显示写了构造函数,编译器就不会再生成。...,编译器就不会默认生成); 再来看,构造函数可以重载,我们就可以这样写: class Data { public: Data() { _year = 1; _month = 1; _day...4、如果未显示定义拷贝构造,编译器会自动生成拷贝构造函数; 5、  像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的拷⻉构造就可以完 成需要的拷⻉,所以不需要我们显⽰实现拷⻉...4、  像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的赋值运算符重载就4可以完成需要的拷贝,所以不需要我们显示实现赋值运算符重载。         ...0; }         3.2、 取地址运算符重载         取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,一般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现

    11010

    【C++初阶路】--- 类和对象(中)

    this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传。 1.3....构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。...Date d3(); } 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...,代码可以通过编译,因为编译器生成了一个无参的默认构造函数; 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成; 无参构造函数,放开后报错:error C2512...注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

    12010

    【c++】拷贝构造和赋值运算符重载

    C++规定自定义类型对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参和传值返回都会调用拷贝构造完成。 若未显式定义拷贝构造,编译器会生成自动生成拷贝构造函数。...像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的拷贝构造就可以完成需要的拷贝,所以不需要我们显示实现拷贝构造。...像Stack这样的类,虽然也都是内置类型,但是 a指向了资源,编译器自动生成的拷贝构造完成的值拷贝/浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。...没有显式实现时,编译器会自动生成一个默认赋值运算符重载,默认赋值运算符重载行为跟默认构造函数类似,对内置类型成员变量会完成值拷贝/浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用他的拷贝构造...像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的赋值运算符重载就可以完成需要的拷贝,所以不需要我们显示实现赋值运算符重载。

    14410

    【C++初阶】一文讲通默认成员函数~类和对象(中)

    类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数(注意并不意味着只有编译器生成的才是默认成员函数)。...如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。...(这也可以通过VS的逐语句调试功能看见) 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构函数。...C++规定自定义类型对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参和传值返回都会调用拷贝构造完成。 若未显式定义拷贝构造,编译器会生成自动生成拷贝构造函数。...像 Date 这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的拷贝构造就可以完成需要的拷贝,所以不需要我们显示实现拷贝构造。

    12910

    【C++】类与对象篇二

    默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数;用户显式定义对应成员函数,编译器将不再生成对应默认成员函数; (2) . “ 任何类 ” 在什么都不写时,编译器会自动生成以下6...构造函数 (1) . 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时(对象的实例化)由编译器自动调用,并且在对象整个生命周期内只调用一次。 (2) ....如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成无参默认构造函数(可手动生成无参构造函数,因为构造函数可以重载),则不能实例化无参对象。...析构函数 (1) . 析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的 “ 清理工作 ”。...拷贝(复制)构造函数 (1) . 拷贝构造函数 :只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

    7510

    C++第四弹 -- 类与对象中篇上(构造函数 析构函数 拷贝构造函数)

    其特征如下: 函数名与类名相同 无返回值(不需要写void) 对象实例化时编译器自动调用对应的构造函数 构造函数可以重载 如果类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,...注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。...,初始的方法就是调用它的默认构造函数, //默认构造函数有三个,无参构造函数,全缺省构造函数,和编译器自动生成的构造函数,简单理解不含参的构造函数 //1.如果它有默认构造则不会报错,包括编译器自动生成的...} //但是编译器自动生成构造函数,只初始化内置类型,C++针对内置类型成员不初始化的缺陷,又打了补丁, //即:内置类型成员变量在类中声明的时候可以给默认值 //总结一下:如果类中只有内置类型,自己写构造函数初始化...构造函数用于初始化对象,在对象创建时由编译器自动调用;析构函数用于清理对象资源,在对象生命周期结束时由编译器自动调用;拷贝构造函数用于创建与已有对象相同的新对象,在使用已存在的类类型对象创建新对象时由编译器自动调用

    10910

    【C++】类和对象(中)--上篇

    一、类的六个默认成员函数 如果有个类中什么成员都没有,那么被称为空类 由编译器自动生成的成员函数称为默认成员函数 空类中会自动生成六个默认成员函数,这六个默认成员函数在每个类中都会自动生成 ①初始化功能的构造函数...,对二者有不同的操作 二、构造函数 1、构造函数基本概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个成员都要初始化,并且在对象整个生命周期内只调用一次 2...,则编译器会自动生成一个无参的默认构造函数,如果有显式定义,编译器将不再生成 class Date { public: //无参构造函数 Date() {} private: int _year...; int _month; int _day; }; 由编译器自己生成: 编译器会自动生成一个无参的默认构造函数,初始化给的是随机值 (6)行文至此有人会觉得编译器给的无参的默认构造函数很垃圾...,是调用的编译器自动生成的拷贝构造函数 在执行析构函数的时候出现了错误,这里的原因是数组a已经被释放了,再次释放产生错误 因为编译器自动生成的拷贝构造函数是值拷贝,所以在生成s2时,s2中的指针

    7310

    【笔记】《Effective C++》条款1-25

    为了解决这个问题, 最好在程序最开始还是单线程启动的时候在一个函数中有顺序地集中初始化所需的所有static成员, 然后再启动多线程 2 构造/析构/赋值运算 5 了解C++默默编写并调用哪些函数 编译器会在类的构造函数被调用但是我们没有自己声明时自动创建...只有当编译器能够确认自己可以合法进行操作时编译器才会自动生成默认函数, 否则编译器拒绝生成相关的函数....例如包含了引用成员的类和包含const成员的类都不会生成默认的拷贝构造函数 6 若不想使用编译器自动生成的函数, 就该明确拒绝 拒绝编译器自动生成函数的传统方法是自己声明一个private的对应函数然后固定不去实现它..."合法值" 需要继承/被继承么 需要哪些类型转换 需要哪些操作符 哪些编译器函数需要拒绝 成员的访问性 哪些接口需要实现 设计有多么一般化 真的需要这个type么 20 宁以pass-by-reference-to-const...替换pass-by-value 缺省情况下C++默认传值方式将对象传到函数, 也就是由拷贝构造函数生成 因此如果只是简单地传入对象会浪费很多的构造/析构操作, 最好的做法是传const引用 传const

    1.1K30
    领券