草庐IT

<四>构造函数初始化列表

ericshi1985 2023-04-15 原文

示例代码1

class CDate{

    public:
    CDate(int _year,int _month, int _day){
       this->year=_year;
       this->month=_month;
       this->day=_day;
    }

    private:
      int year;
      int month;
      int day;
};

class Student2{

public:

   Student2(const char * _name , int _id, int _year,int _month ,int _day) {
     this.ID=_id;
     strcpy(name,_name);
  }

 private:
     char  name[20];
     int   ID;
     CDate age;
};


int main(){
    Student2 s("zhangsan",1001,2022,1,1);
    return 1;
}

上面代码编译报错,student类对象在初始化的时候,需要初始化成员CDate,但是由于CDate有自定义的构造函数,系统
找不到无参构造函数,所以报错. 改造代码后如下

示例代码2

class CDate{

    public:
    CDate(int _year,int _month, int _day){
       this->year=_year;
       this->month=_month;
       this->day=_day;
    }

    private:
      int year;
      int month;
      int day;
};

class Student2{

public:

   Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){

     strcpy(name,_name);

  }

 private:
     char  name[20];
     int   ID;
     CDate age;
};


int main(){

    MyString s1("abcd");
    s1.printChar();

    MyString s2=s1;//执行拷贝构造
    s2.printChar();

    MyString s3("1234");
    s3=s1;//执行赋值函数
    s3.printChar();

    
    return 1;
}
: ID(_id), age(_year,_month,_day) 构造函数中 冒号右边的 叫做 构造函数初始化列表


  Student2(const char * _name , int _id, int _year,int _month ,int _day) : ID(_id), age(_year,_month,_day){
     strcpy(name,_name);
  }

  Student2(const char * _name , int _id, int _year,int _month ,int _day) :  age(_year,_month,_day){
     this.ID=_id
     strcpy(name,_name);

  }

  上面两种方式有什么区别?
  `: ID(_id), age(_year,_month,_day) ` 构造函数初始化列表 中 ID(_id) 相当于 int ID=_id; 定义同时初始化

  Student2(const char * _name , int _id, int _year,int _month ,int _day) {
     this.ID=_id // 这种方式相当于 int ID; ID=_id; 先定义,然后再初始化.
     strcpy(name,_name);
  }

  针对简单内置的基础数据类型这两种方式汇编指令区别不大,但是如果是CDate类类型,如果像下面这样
   Student2(const char * _name , int _id, int _year,int _month ,int _day) 
    : ID(_id) , 
    age(_year,_month,_day)
    {
     strcpy(name,_name);
    }

  编译器其实会这样做
  1:CDate age=Date(_year,_month,_day);//定义age对象同时做初始化,并直接指定了构造方式

  如果是下面方式
    Student2(const char * _name , int _id, int _year,int _month ,int _day)     
    {
     this->ID=_id;
     this->age=CDate(_year,_month,_day);
     strcpy(name,_name);
    }
 编译器其实会这样做
  1:先创建一个 CDate 对象 age   CDate age();//使用无参构造函数
  2:age=CDate(_year,_month,_day);
 上面在第一步的时候,系统调用无参构造函数的时候就报错了,因为没有无参的构造函数.

有关<四>构造函数初始化列表的更多相关文章

  1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  6. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  7. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  10. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

随机推荐