精华内容
下载资源
问答
  • c++一个类中定义另一个只有带参数构造函数的对象,编译通不过 class A {  public: A(int i){}  }; class B {  public: B(){}  private:  //A a; //这里当然通不过,没有可用的构造函数  A...

    c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过

    class A {
    
        public:  A(int i){}
    
        };
    
    class B {
    
        public:  B(){}
    
        private: 
    
          //A a; //这里当然通不过,没有可用的构造函数 
    
          A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!
    
    };
    
    void main() {  B b; }
    

    我现在想在B类的数据成员中定义A类的对象,但是A类中只有带参数的构造函数,请问如何解决?

    改成:

     #include<iostream>
    
    using namespace std;
    
    class A { public:  A(int i){} };
    
    class B {
    
      public:  B():a(5)//构造函数初始化子对象  {  }
    
      private:  //A a; //这里当然通不过,没有可用的构造函数 
    
      A a; //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!
    
      };
    
    void main()
    
    {  B b; }  

    注意重点来了: 在B中定义 A a; 是可以通过的,但在其他地方(比如函数中)这样是不对的。 在B中定义 A a; 只是告诉编译器:“B有一个A类的对象”,并不在定义的时候创建a这个对象成员,也就不考虑它的构造函数。a这个对象成员的创建是在执行B的构造函数时进行的,B的构造函数后面必须以初始化表的形式为a对象成员提供参数,比如 B( ) : a( 1 ) { } 如果在构造函数中不为a提供参数,会发生错误。 在其他地方(比如函数中)定义A的对象时,必须定义成 A a(参数);的形式。因为定义时就要创建A的对象,所以要考虑它的构造函数。

    你的程序出现错误不是因为在B中定义 A a;引起的。

    是因为:

    1、你定义了A a(5)。 这是不行的,因为此时并不创建A对象,不能为其提供参数。你说“编译器把此语句当成一个定义一个函数A a()”也是不对的。就是因为这时不能为a提供参数,一定要在B的构造函数中提供!

    2、你的程序没有为B提供一个“可以为a提供参数”的构造函数。 这样你在主函数中定义B b的时候,就不能初始化它里面的a。

    所以,你的代码应将这两个错误改过来,即写成如下:

    class A
    
    {
    
    public:    
    
      A( int i ){}
    
    };
    
    class B {
    
    public:    
    
      B():a(1){}   
    
    //或:B( int i ):a( i ){ }。对a提供参数一定要按                  
    
    //这种形式,在冒号后,不能在花括号里面!
    
    private:    
    
      A a;
    
    };
    
    void main()
    
    {    
    
      B b;
    
    }
    展开全文
  • Kotlin构造函数及多个构造函数

    万次阅读 2018-05-07 17:57:44
    Kotlin构造函数首先 强调一下 如果下面这样行代码是构造函数的话 class ClassName(name:String){}那么每一个Kotlin类只有一个构造函数 没有多个构造函数其实由于代码什么的都是源于国外的 所以在翻译过程多说...

    Kotlin构造函数

    首先 强调一下 如果下面这样行代码是构造函数的话 

    class ClassName(name:String){}

    那么每一个Kotlin类只有一个构造函数 没有多个构造函数

    其实由于代码什么的都是源于国外的  所以在翻译过程中多说会有些出入 毕竟我们不是翻译官 而大多数的翻译官又不懂代码

    实际上Kotlin的构造函数 都是用构造器的 上面的代码其实是省略了constructer()的  在Kotlin中init()函数是主结构器内置函数

    class ClassName constructer(name:String){
         init{
             print("test == ${name}")
         }
    }

    请在看完这篇文章之后我不希望听到kotlin中的构造函数 主构造器 次级构造函数 同时出现,以后请直接说主构造函数 次构造函数 或者主构造器 次构造器

    现在进入正题

    主构造函数

    class ClassName constructer(name:String){
         init{
             print("test == ${name}")
         }
    }

    或者

    class ClassName (name:String){
         init{
             print("test == ${name}")
         }
    }

    其中元素name可以用var修饰 将其变为全局变量

    class ClassName constructer(var name:String){
         init{
             print("test == ${name}")
         }
    }

    次级构造函数 可以为多个 但是不支持init()函数

    class ClassName constructer(name:String){
         init{
             print("test == ${name}")
         }
         constructor(name: String, alexa: Int):this(name){
            print("test == ${name}")
            print("test == ${alexa}")
        }
        constructor(name: String, alexa: Int,onemore:String):this(name){
            print("test == ${name}")
            print("test == ${alexa}")
            print("test == ${onemore}")
    
        }
    }
    最后希望大家对代码有属于自己的理解 
    展开全文
  • class A{public: A( int i ){}};class B {public: B():a(1){} //或:B( int i ):a( i ){ }。对a提供参数一定要按 //这种形式,在冒号后,不能在花括号里面!private: A a;...}注意: 在B定义 A a...
    class A
    {
    public:    
      A( int i ){}
    };
    class B {
    public:    
      B():a(1){}   
    //或:B( int i ):a( i ){ }。对a提供参数一定要按                  
    //这种形式,在冒号后,不能在花括号里面!
    private:    
      A a;
    };
    void main()
    {    
      B b;
    }
    在B中定义 A a; 是可以通过的,但在其他地方(比如函数中)这样是不对的。 在B中定义 A a; 只是告诉编译器:“B有一个A类的对象”,并不在定义的时候创建a这个对象成员,也就不考虑它的构造函数。a这个对象成员的创建是在执行B的构造函数时进行的,B的构造函数后面必须以初始化表的形式为a对象成员提供参数,比如 B( ) : a( 1 ) { } 如果在构造函数中不为a提供参数,会发生错误。 在其他地方(比如函数中)定义A的对象时,必须定义成 A a(参数);的形式。因为定义时就要创建A的对象,所以要考虑它的构造函数。
    类中定义的所有对象(包括基本类型的数据对象、无参类对象等等)的构造都是在此类的初始化列表中进行的,只不过无参和基本类型的对象被省略了。在构造函数体内的所谓初始化,只是给已经生成的对象重新赋值罢了,并没有进行对象的构造。就是说对象构造必须在初始化列表里。这意味着其他类对象的构造先于本类的构造。
    如果在类中声明的是其他类的指针,则指针初始化可以后于本类的构造。比如:
    class B {
    public:    
    B()
    {
    a=new A(1);
    }   
    private:    
      A* a;
    };
    产生区别的原因是其他类对象属于类对象成员,指针不属于类对象成员。类在构造对象时,默认会先构造类对象成员(相当于在初始化类表中),在默认构造函数中会释放类对象成员的资源。而指针不属于类对象成员,不会被默认分配内存,也不会默认释放,需要手动分配内存,在析构函数中手动释放内存(自定义析构函数后,默认析构函数还是存在,而且会执行,先执行自定义的析构)。

    展开全文
  • C++中类构造函数与复制构造函数

    千次阅读 2017-04-27 10:52:42
    在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过...

    1 相关定义

    1.1 构造函数

    构造函数是类的特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。构造函数的工作是保证每个对象的数据成员具有合适的初始值。构造函数的名字与类的名字相同,并且不能指定返回类型。像其他任何函数一样,它们可以没有形参,也可以定义多个形参。

    1.2 复制构造函数

    复制构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。

    2 两种初始化方式

    C++支持两种初始化方式:直接初始化和复制初始化。

    2.1 两种初始化方式的实现

    复制初始化使用=符号,而直接初始化将初始化式放在圆括号中。

    自定义一个名为MyClass的类。并且定义MyClass类的默认构造函数、自定义构造函数和复制构造函数。

    class MyClass
    {
    public:
    MyClass()
    {
    cout << "进入MyClass的默认构造函数" << endl;
    }
    MyClass(const char* pc)
    {
    cout << "进入MyClass自定义构造函数" << endl;
    }
    MyClass(const ClassTest& ct)
    {
    cout << "进入MyClass复制构造函数" << endl;
    }
    };

    接下来使用直接初始化和复制初始化定义MyClass类的对象:

    MyClass mc1(“myclass”);
    MyClass mc2 = mc1;

    运行后的效果如图所示

     

    从上图可以看出,第1行代码调用了MyClass类的自定义构造函数,第2行代码调用了MyClass类的复制构造函数。

    2.2 两种初始化方式的关系

    对于MyClass类对象的定义,还有一种方式,如下所示

    MyClass mc3 = “myclass”;

    这种定义方式是采用了哪种初始化呢?《C++ Primer中文版第4版》P407页提到,以上这种定义方式,“编译器首先调用接受一个C风格字符串形参的构造函数,创建一个临时对象,然后,编译器使用复制构造函数将类的对象初始化为那个临时对象的副本”。也就是说,以上代码应该调用了MyClass类的两个构造函数,一个是自定义的参数为const char*的构造函数,一个是复制构造函数。然而,程序运行后的效果如图所示

     

    此时,只调用了MyClass类的自定义函数,而没有调用复制构造函数。产生这个现象的原因,在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这个特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过直接调用自定义构造函数来初始化对象,而不再调用复制构造函数,完成优化”。这位朋友还提到,如果将复制构造函数改为private,此时如下代码

    MyClass mc3 = “myclass”;

    编译时就会报错。

    但是,至少在VC++6.0及以上版本的编译器中,并不是这样的。在VC++6.0/VS2005/VS2008/VS2010/VS2015中进行测试,当将MyClass类的复制构造函数改为private后,上述代码编译时并不报错,而且都仅显示“调用了自定义构造函数”。这就说明,至少在VC++6.0/VS2005/VS2008/VS2010/VS2015的编译器当中,如下代码

    MyClass mc3 = “myclass”;

    并没有像《C++ Primer中文版第4版》中提到的那样,调用了两次构造函数,而是只调用了自定义的构造函数。可以说,在VC++6.0/VS2005/VS2008/VS2010/VS2015

    MyClass mc1(“myclass”);

    MyClass mc3 = “myclass”;

    是等价的。

    3 编译器优化

    VC++6.0/VS2005/VS2008/VS2010/VS2015中进行测试时,确实发现了在“2.2”中提到的编译器优化问题。对于如下代码

    MyClass mc4 = MyClass();

    VC++6.0中进行测试时,运行结果显示编译器先调用MyClass类默认构造函数,之后调用复制构造函数;而在VS2005/VS2008/VS2010/VS2015中则只显示编译器调用了默认构造函数。并且如果将复制构造函数设置为private,编译器会报错,如下所示:

     error C2248: ClassTest::ClassTest: 无法访问 private 成员(在“ClassTest”类中声明)

    这就说明,在VS2005/VS2008/VS2010/VS2015中,编译器进行了优化,当发现复制构造函数是public时,直接调用默认构造函数。而当复制构造函数是private时,就会报错。

    展开全文
  • C++——构造函数

    千次阅读 2018-08-29 13:57:31
    每个都分别定义了它的对象被初始化的方式,通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫构造函数构造函数的任务是初始化对象的数据成员,无论何时只要的对象被创建,就会执行构造...
  • 一个模板类中构造函数和模板构造函数同时存在时,优先调用构造函数只有当确切符合模板构造函数的接口时,才调用模板构造函数。编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,...
  • Java构造函数中调用构造函数

    万次阅读 2014-11-30 15:09:56
    在Java,当为一个类创建了多个构造函数时,有时想在一个构造函数中调用另一个构造函数以减少代码量。这时可以使用this关键字来实现。  通常,当使用this关键字时,它意味着“这个对象”或者“当前对象”,并且它...
  • 派生类中构造函数

    千次阅读 2018-04-16 22:56:49
    对于一般的来说,如果不声明构造函数,则自动调用默认构造函数class A{public:A();...多数情况下,编译器为生成一个默认构造函数只有以下两种情况除外:1、一个类显式地声明了任何构造函...
  • 拷贝构造函数是一种特殊的构造函数,用基于同一一个对象构造和初始化另一个对象。当一个类的对象向该的另一个对象赋值时,就会用到该的赋值函数。拷贝构造函数一个对象初始化一块内存区域,这块内存就是新...
  • 构造函数

    千次阅读 2016-03-07 22:28:52
    构造函数的函数名与类名相同,没有返回类型,不能声明为const成员函数(因为直到构造函数初始化过程后,对象才能真正的取得其常量属性)一个类中可以有多个构造函数构造函数一个初始化列表。   &构造函数初始...
  • 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不手动编写上述函数,C++编译器将自动为类A生成四个缺省的函数:  A(void);...
  • 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!...每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不编写上述
  • 每个C++类只有一个析构函数,但可以有多个构造函数和多个赋值函数。其中构造函数包括默认构造函数(无参,或参数全有默认值),拷贝构造函数。在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个...
  • C++默认构造函数就是没有形参的构造函数。准确的说法,按照《C++ Primer》...《C++ Primer》的说明:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数。这条规则的根据是,如果一个类再某种情况下
  • C++ Primer在讲构造函数初始化列表的时候有这么段话:  无论是在构造函数初始化列表初始化成员,还是在构造函数对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据...
  • C++构造函数之委托构造函数

    万次阅读 多人点赞 2016-10-20 22:16:05
    C++11新标准扩展了构造函数初始值的功能,所以委托构造函数就出现了,一个委托构造函数使用它所属的其他构造函数执行它自己的初始化过程,或者说他把自己的一些(或全部)职责委托给了其他构造函数。 1.定义: ...
  • 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数(也只是在需要的...
  • 本文将主要介绍前四个成员函数:一、构造函数在c++程序,对象的初始化时一个不可缺少且十分重要的问题,因此c++在的设计提供了构造函数构造函数,顾名思义,为对象分配空间,进行初始化,它是一种特殊的...
  • scala 定义构造函数与继承

    千次阅读 2016-11-09 23:52:04
    1.scala如何定义scala定义的方式很简单class Point(xc:Int,yc:Int)上面这行代码就定义了一个类 1.首先是关键字class 2.其后是类名 Point 3.类名之后的括号构造函数的参数列表,这个例子的两个...
  • C++函数之构造函数析构函数

    千次阅读 2015-02-25 10:01:59
    对于对象成员的初始化我们始终是...关于C++成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数一个基本定义:  1,C++规定,每个必须有默认的构造函数,没
  • 如果定义时没写构造函数,则编译器生成一个默认的无参构造函数,这个构造函数不做任何操作。如果定义了构造函数,则编译器不生成默认的无参构造函数。 对象生成时构造函数自动被调用,对象一旦生成,就再也不能在...
  • 复制构造函数

    千次阅读 多人点赞 2018-09-03 11:11:35
    复制构造函数是一种特殊构造函数,在生成一个实例时,一般会同时生成一个默认的复制构造函数,复制构造函数完成一些基于同一的其他对象的构建及初始化工作。 特点 复制构造函数名与类名同名,因为它是一种...
  • TypeScript构造函数

    千次阅读 2020-10-19 11:14:53
    在页面里新建一个 Person 的里边定义一个name,但是name我们并不给他值,然后我们希望在new出对象的时候,直接通过传递参数的形式,给name赋值,并打印出来。这时候我们就需要用到构造函数了,构造函数的关键字...
  • 默认构造函数构造函数重载

    万次阅读 多人点赞 2017-09-29 08:15:52
    对象被创建时,编译器为对象分配内存空间,并自动调用该构造函数,由构造函数完成数据成员的初始化工作。、默认构造函数 从代码层面进行分析 class testClass { public : testClass();//不带参数的默认
  • C++构造函数和析构函数

    千次阅读 2015-09-22 06:22:59
    构造函数构造函数一类特殊的成员函数,它的目的是完成对象的初始化。构造函数的名字和类名相同,可以有参数,但不能有返回类型。class ClassName { public: /*构造函数,可以在声明定义*/ ClassName(参数...
  • C#静态构造函数

    千次阅读 2017-12-22 16:29:37
    使用静态构造函数一个原因是:在第一次使用之前,用静态构造函数来初始化(当然也包括结构体,这里用做阐述)一些静态字段或属性。比如对字段或属性进行一系列的操作进行初始化,而不希望每次实例化的时候...
  • 对 c++成员函数构造函数 拷贝构造函数 析构函数 赋值运算符重载的一些特点以及函数调用顺序,并附上例子,希望对大家有帮助,有错误大家可以指出来。
  • 将拷贝构造函数和重载赋值运算符设为private来禁止拷贝

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530,643
精华内容 212,257
关键字:

一个类中只有一个构造函数