精华内容
下载资源
问答
  • EnumTest-初始化类的类成员对象初始化列表方式)
  • 常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。 class B{ } class A{  public:  A():number(n),ref(r),b(b1){...}  private:  const int number;  int & ref;  B b...
    常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。

    class B{
    }

    class A{
         public:
                  A():number(n),ref(r),b(b1){...}
         private:
           const int number;
           int & ref;
           B b;
        
    }
    那为什么是常量,引用,对象成员这三者不可以直接初始化,而要放在成员初始化表中呢?

    1.对于常量:

        常量是不可以被赋值的,不能在创建对象的时候点取常量成员然后赋值给它.
       A  a;
       a.number=10;  // error;
       更加 不可以直接就在类的定义中赋值
       class A{
         const int number=10;
       } 
       因为每个对象的number可能是不一样的,这样直接赋值的话,就是要求类的所有对象的number都是固定的,这样很明显不合逻辑。
       另外,有些书认为这样是在给常量赋值,所以是不允许的。

    2.对于引用:

        引用本质上来讲也是一种常量,那么它也是不可重新指派的,初始化之后就固定不变。

    3.对于对象成员:

       对象成员出现在成员初始化表上,实际上 相当于调用该对象所属类的构造函数,b(b1)即是以b1为参数调用B的构造函数。

       如果不这样做的话,要实现初始化似乎只能传递对象参数生成临时对象来实现,这样的话,根本没有起到初始化的作用。
       请看例子:
    #include <iostream>

    using namespace std;

    class StudentID{

        public:
            StudentID(int id){
               value =id
               cout<<"Assigning student id "<<value<<endl;
            }
            ~StudentID(){
               cout<<"Destructing id " << value <<endl;
            }

        protected:
            int value;
    }

    class Student{
        public:
            Student(char * pName="noName",int ssID=0){
                cout<<"Constructing student "<<pName<<endl;
                strcpy(name,pName);
                name[sizeof(name)-1]='\0';
                StudentID id(ssID);
            }

        protected:
            char name[20];
            StudentID id;
    }

    int main(){
        Student s("Randy",9818);
    }
    print:
    Assigning student id 0
    Constructing student Randy         
    Assigning student id 9818  // 当传递9818给StudentID id(ssID)的时候,调用StudentID的构造函数,这样就在Student的构造函数产生了一个局部对象
    Destructing id 9818           // 当
    Student的构造函数对象结束的时候,该对象就析构了,那么id 9818就没有了,实际上9818没有初始化Randy的id;
    Destructing id 0                // Randy的id仍然为0,程序结束的时候析构。


    构造对象的顺序--按照成员属性声明的顺序,而不是成员初始化表的顺序。

    静态对象之构造一次。

    所有全局对象在main()函数之前被构造,且一般按照声明的顺序。
    展开全文
  • 新的概念:对象成员声明、初始化和访问 ...具体方法:定义"大对象"所在类的构造函数时,在成员初始化列表中将参数传递到"小对象"成员的构造函数中。成员初始化列表的格式为 <对象成员1>(<初值表>

    新的概念:对象成员声明、初始化和访问

    声明:

    1. 对象成员的声明与其他成员相同,语法格式为:<类名><对象成员名>
    2. 就如上篇中 “Point m_center” 就是在Circle类中声明的一个成员

    初始化:
    对象成员的初始化是通过调用构造函数来完成的,即一个对象成员的初始化时“大对象”被创建时一同被创建的。
    具体方法:定义"大对象"所在类的构造函数时,在成员初始化列表中将参数传递到"小对象"成员的构造函数中。成员初始化列表的格式为
    <对象成员1>(<初值表>),<对象成员2>(<初值表>)……
    例如:

    Circle(double cx,double cy,double cr):m_center(cx,cy
    展开全文
  • 成员初始化列表

    千次阅读 2017-03-18 17:44:29
    2、成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前。 3、初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量。 例如下代码: Queue:...
        1、对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化
        2、成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前
        3、初值可以是常量或构造函数的参数列表中的参数,这种方法并不限于初始化常量
        例如下代码:
        Queue::Queue(int qs) : qsize(qs), front(NULL), rear(NULL), items(0)
        {
        }
        4、只有构造函数可以使用这种初始化列表语法。对于const类成员,必须使用这种语法。另外,对于被声明为引用的类成员,也必须使用这种语法。这是因为引用和cosnt数据类似,只能在被创建时进行初始经。对于简单数据成员使用成员初始化列表和在函数体中使用赋值没有什么区别。
        5、对于本身就是类对象的成员来说,使用成员初始化列表效率更高
        6、从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。
        7、不能将成员初始化列表语法用于构造函数之外的其他类方法
        8、必须用这种格式来初始化非静态const数据成员
        9、必须用这种格式来初始化引用数据成员
    展开全文
  • 成员初始化列表: 在类构造函数中,不在函数体内对变量赋值,而在参数列表后,跟一个冒号和初始化列表。 初始化和赋值对内置类型的成员没有什么大的区别,像上面的人一个构造函数都可以。对非内置类型成员变量,...

    成员初始化列表:

    在类构造函数中,不在函数体内对变量赋值,而在参数列表后,跟一个冒号和初始化列表。

    初始化和赋值对内置类型的成员没有什么大的区别,像上面的人一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但是有时候必须使用带初始化列表的构造函数。

    ①:成员类型是没有默认构造函数的类。若没有提供显示初始化,则类创建对象时会调用默认构造函数,如果没有默认构造函数,则必须显示初始化。

    ②:const成员或者引用类型的成员。因为const对象或者引用类型只能初始化,不能赋值。

    为什么成员初始化列表效率更高?

    因为对于非内置类型,少了一次调用默认构造函数的过程。

    展开全文
  • 一、对象初始化过程 1、示例代码 2、分析 3、总结 二、对象调用成员的过程 1、代码示例 2、分析 3、总结 一、对象初始化过程 1、示例代码 给出如下代码,请问一共有几条打印语句,分别是什么? public ...
  •  一个有趣的 现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响,只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函数可以有多个,因此会有多个不同次序的初始化表。如果...
  • Java类成员初始化

    千次阅读 2013-05-30 15:03:16
    Java类成员初始化与C++初始化的方式有很多不同,这部分知识相对比较基础,从而导致很多Java程序员对于Java类初始化机制不甚了了。下面就Java类成员初始化方式做一个梳理,希望对大家有益。 一、 所有变量使用前都...
  • JAVA笔记-类的初始化对象初始化

    千次阅读 2016-06-26 13:19:24
    类的初始化对象初始化 初学Java,觉得类的初始化对象初始化这一块真的特别重要,翻了很多大神前辈的整理资料,还是有些懵懂,决定将资料整理下,也希望对后来的初学者有些许帮助。 上图为类的生命周期 ...
  • 通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
  • 类和对象初始化

    千次阅读 2018-06-03 17:26:29
    本文主要通过例子来理解 Java 中类和对象初始化顺序问题
  • C++成员初始化列表详解

    千次阅读 2015-10-24 11:22:09
    C++成员初始化列表详解 在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? ...
  • } 2、对象成员初始化,如果该对象成员有不带参数的构造函数,则在本类构造函数处(瑶瑶按:这里的“本类”指的是CMyClass)可以直接赋值,因为其默认调用了不带参数的构造函数为其分配空间: 3、但如果该对象...
  • C++回顾之类数据成员初始化

    千次阅读 2014-02-06 14:46:54
    构造函数初始化列表,类中的普通对象成员初始化,const成员及引用成员的初始化方法。
  • 派生类不能在成员初始化列表中直接初始化基类的成员 初始化基类成员 构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员...
  • 编译器如何处理初始化成员列表的。 下列情况中,必须要使用member initialization list进行data member 的初始化: 1) 当初始化一个reference member。 2) 当初始化一个const member。 3) 当调用一个base class 的...
  • C++ 类(构造函数的成员初始化列表)

    千次阅读 2018-07-21 13:29:52
    构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A { private: int a; public: A(int a) { this-&gt;a = a; } int getA() { re...
  • C++类成员和数据成员初始化总结

    万次阅读 2013-05-24 22:15:38
    C++为类中提供类成员初始化列表。 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算  1.类里面的任何成员变量在定义时是...
  • java学习之对象初始化过程

    千次阅读 2015-05-12 12:58:40
    创建对象时,对象初始化过程: 1、类中数据成员的隐式初始化。(下图例子中num隐式初始化为0) 2、子类的构造函数进栈。 3、父类构造函数初始化。(因为子类构造函数第一行有隐式的super()) 4、子类中成员变量...
  • C++类和对象(下)——初始化列表、static成员和友元

    千次阅读 热门讨论 2021-03-08 09:23:18
    C++类和对象——初始化列表、static成员和友元一、再谈构造函数1.1 构造函数整体赋值1.2 初始化列表三级目录 关于C++类和对象的学习 C++类和对象(上)——类的基本概念、类的限定符及封装和类成员函数的this指针 C++...
  • 成员初始化可以在构造
  • 成员初始化

    千次阅读 2014-07-29 16:46:03
    成员初始化表#include class Account {public:Account();Account( const char*, double=0.0 );Account( const string&, double=0.0 );Account( const Account& );// ...private:// ...}; //注意:构造函数的初始化...
  • 先总结下:由于类成员初始化总在构造函数执行之前1)从必要性: a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数 b. 成员是常量或引用:成员无法赋值,只能被初始化2)从效率上:...
  • 静态成员数据 静态对象初始化

    千次阅读 2010-04-18 10:45:00
    2.静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值...
  •  然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员变量,所以在其前初始化了。或者说是成员自己有自己的能力来初始化自己,不用构造函数来管,这部分属于...
  • 静态成员数据 静态对象初始化 .

    万次阅读 2012-09-15 22:13:45
    2.静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值...
  • JAVA之对象初始化过程详解及面试题

    千次阅读 2017-07-20 08:48:15
    初始化父类的静态成员初始化父类的静态代码块初始化子类的静态成员初始化子类的静态代码块初始化父类的非静态成员初始化父类的非静态代码块初始化父类的构造方法初始化子类的非静态成员初始化子类的非静态代码块初始...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 529,790
精华内容 211,916
关键字:

对象成员初始化