精华内容
下载资源
问答
  • 2020-03-31 09:42:46

    未初始化的类成员变量

     

    在gcc 4.8.5版本

    如果还有未初始化的类成员变量,其值不确定

    #include <iostream>
    
    class T {
        public:
            T() {}
    
        float tt;
        int it;
    };
    
    
    int main() {
        float ff;
        cout << ff << endl;
    
        T t1;
        cout << t1.tt << endl;
        cout << t1.it << endl;
    
        return 0;
    }
    

    结果

    [root@mx xsp2]# ./a.out
    0
    -17304.5
    32766
    [root@mx xsp2]# ./a.out
    0
    1.78996e+11
    32767
    [root@mx xsp2]# ./a.out
    0
    2.91494e-38
    32766
    [root@mx xsp2]# ./a.out
    0
    9.19502e+18
    32767
    [root@mx xsp2]# ./a.out
    0
    -3.06696e-30
    32767
    [root@mx xsp2]# ./a.out
    0
    -78.9587
    32764
    

     

     

    更多相关内容
  • 通常静态数据成员声明中声明,在包含方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的.但如果静态成员是整型或是枚举型const,则可以在声明中初始化
  • c++类成员变量初始化详解

    千次阅读 2022-04-15 10:08:24
    注意在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。 2....

    1.类初始化顺序

    当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。

    注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。

    2.声明时初始化

    第一种方式是在成员变量声明时初始化。可以看如下示例。

    class D {
        int a = 10;
    };
    

    在声明变量a的时候即给其初始化为10。不过注意这种写法是c++11以后才有的。上述代码在IDE中会有如下警告信息:

    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]
    

    3.构造函数初始化列表

    第二种方式是在构造函数中加入一个初始化列表,对成员变量进行初始化。

    class D {
        int a, b;
        string c;
        public:
            D() : a(1), b(2), c("sss") {
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    

    如果我们对D进行实例化,

    int main(int argc, char const *argv[])
    {
        D d;
        return 0;
    }
    

    代码会有如下输出

    a is: 1
    b is: 2
    c is: sss
    

    4.构造函数内部赋值

    在其他语言中,比如java,最常用的方式为在构造函数内部赋值。

    class D {
        int a, b;
        string c;
        public:
            D(int a, int b, string c) {
                this->a = a;
                this->b = b;
                this->c = c;
                cout<<"a is: "<<a<<endl;
                cout<<"b is: "<<b<<endl;
                cout<<"c is: "<<c<<endl;
            }
    };
    
    int main(int argc, char const *argv[])
    {
        D d(1, 2, "sss");
        return 0;
    }
    

    上面代码输出为

    a is: 1
    b is: 2
    c is: sss
    

    5.只能构造函数初始化列表的情况

    如果一个类成员,他本身是一个类或者结构,而且这个类成员没有默认的无参构造函数,只有带参数的构造函数,这个时候对类成员初始化时,必须调用类成员带参数的构造函数。如果再初始化列表中没有完成类成员初始化,代码会报错。

    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上述代码是可以正常运行的,因为类E有默认无参构造函数。

    而如果将代码改为下面的样子,给E加一个带参数的构造函数

    class E {
        int num;
        public:
            E(int n) {
                this->num = n;
            }
    };
    
    class F {
        E e;
        public:
            F() {cout<<"init F class!"<<endl;}
    };
    
    int main(int argc, char const *argv[])
    {
        F f;
        return 0;
    }
    

    上面代码在IDE里直接会报错:

    constructor for 'F' must explicitly initialize the member 'e' which does not have a default constructor
    

    此时需要将F的构造函数改成如下形式:

    class F {
        E e;
        public:
            F() : e(10) {cout<<"init F class!"<<endl;}
    };
    

    另外,如果类的成员变量中有const时候,也需要在成员初始化列表中赋值完成初始化。

    class F {
        private:
            const int num;
        public:
            F(): num(10) {}
    };
    

    比如上面类F中有一个const常量num,就需要再F构造函数列表中对其进行赋值,否则代码会报错。

    6.列表初始化与构造函数初始化区别

    当采用列表初始化的时候,代码直接调用了成员变量的构造函数,只需要一步就可以完成。
    而在构造函数中初始化的时候,先调用的是成员变量的默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
    当类的结构较为复杂的时候,会存在性能上的差异。

    展开全文
  • 构造函数初始化时必须... (常量成员)需要初始化const修饰的类成员 3. (引用)需要初始化引用成员数据class A { ... private: int a; }; class C{ C(int b); }; class B : public A { ... private: int a;...

    构造函数初始化时必须采用初始化列表一共有三种情况, 
    1. 没有默认构造函数的类成员对象() 
    2. (常量成员)需要初始化const修饰的类成员 
    3. (引用)需要初始化引用成员数据

    class A {
    ...
    private:
         int a;
    };
    class C{
        C(int b);
    };
    class B  : public A {
    ...
    private:
         int a;
    public:
         const int b;//需要在初始化列表初始化
         A &c;//需要在初始化列表初始化
         static const char* d;
         B* e;
         C f;//需要在初始化列表初始化
         const static int b;//需要在初始化列表初始化
    }

    不需要初始化的有 
    1. 指针 

    2. static 标记的,static const 也不需初始化列表中


    展开全文
  • Java自动初始化类成员变量详解

    千次阅读 2017-07-18 11:49:31
    前言:为什么Java初始化成员变量不用赋值,而初始化局部变量就要赋值呢?Java的默认初始化成员变量,自动会给成员变量赋值。

    前言:
    为什么Java类中初始化成员变量不用赋值,而初始化局部变量就要赋值呢?这是因为Java类初始化成员变量时候,会自动会给成员变量赋值。

    1.实例讲解:

    public class MyServlet extends HttpServlet {  
    
        private String url;           //这里没有写=null  
        private String user;  
        private String password;  
    
            .......  
    
        protected void doGet() {  
    
            Connection conn = null;  //这里都用了=null为什么呢?  
            Statement stmt = null;  
            PreparedStatement pstmt = null;  
    
            .......  
            }  
    }  

    看到有网友提出上述疑问,其实忽略了Java类初始化时候会对其成员变量的自动赋值。

    解释:url,user,password这三个变量是MyServlet类的成员变量,在类初始化的时候,会隐式的对成员变量赋初始值,初始值根据具体的变量类型而定(看下面表格),它们都是String,属于引用型变量,所以都会被初始化为null。

    而doGet()方法中conn,stmt,pstmt属于成员变量,Java不会对其隐式初始化,如:

    public static void main(String[] args) {
        String str;
        System.out.println(str.length());//编译不通过,报错
    
    }

    上述方法中,不对变量str进行显式的初始化,直接调用其方法,编译报错:The local variable str may not have been initialized。原因是在局部变量被使用之前,必须要进行显式的实例化(赋值),为变量分配内存空间。
    所以我们平时初始化成员变量会写成如下方式,编译就不会报错:

    public static void main(String[] args) {
            String str = null;  //显式初始化
            System.out.println(str.length());
    
        }

    同理,比如在if-else块,try-catch块中使用变量,变量必须在其外面经过初始化,如:

    int i = 1;
    String str; 
    if ( i > 0 ) {
        str="123";
        str.length();
    }else {
        str.length();//此处编译报错,未实例化str
    }

    上述没有初始化也会报错,因为在else语句块中的str,没有赋初始值。

    2.Java所有数据类型的默认值对照表:

    数据类型初始值
    booleanfalse
    char‘/uoooo’(null)
    byte(byte)0
    short(short)0
    int0
    long0L
    float0.0f
    double0.0d
    引用型(String等)null
    注:引用型数据类型包括:类(class)、接口(interface)、数组(Array)、字符串(String),默认值都为null。

    3.总结
    ①Java对成员变量的自动初始化并赋初始值,节省了开发的代码量;

    ②方法中的成员变量,则需要开发者在声明后,第一次使用该变量之前,显式的赋初始值,实例化该变量。

    展开全文
  • 类成员 成员主要由实例方法和数据成员组成。在中创建了成员后,可以通过的实例进行访问 实例方法 是指在中定义的函数。该函数是一种在的实例上操作的函数。 ‘’‘ 语法: class 类名(): 的说明...
  • 类成员变量初始化总结

    千次阅读 2019-10-11 09:34:11
    中的成员变量类型可分为: 普通成员 常量成员 (const) 引用成员 (&...普通成员可以使用内初始化和初始化成员列表进行初始化。 常量成员和引用成员都只能通过初始化成员列表进行初始化。 静态成员...
  • C++和对象(下)——初始化列表、static成员和友元

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

    千次阅读 2018-07-25 09:40:43
    更新, 忘记当时写的具体是啥了… 大概就是下面这个意思… 今天敲了这样一段代码 (简化版本) #include ...因为 c++ 禁止获取不合格或括号内的非静态... 大家都是知道, 是因为成员隐含参数 this 指针的原因
  • c++类成员初始化方式

    万次阅读 多人点赞 2019-07-11 18:59:33
    转载自: ...常用的初始化可能如下: 1)赋值初始化 class Student { public: Student(string in_name, int in_age) { name = in_name; age = in_age; } private : string...
  • C++如何正确地在初始化vector成员变量

    万次阅读 多人点赞 2019-04-09 10:39:37
    错误的方法 class Foo(){ private: vector<string> name(5); //error in these 2 lines vector<int> val(5,0); } 正确的方法 C++11以后: class Foo(){ private: vector<...strin...
  • 成员变量的初始化顺序

    千次阅读 2018-09-03 11:34:43
    成员变量的初始化顺序只与变量在中的声明顺序有关,与在构造函数中的初始化列表顺序无关。 注意:是与声明顺序有关。 #include&lt;iostream&gt; using namespace std; class A { public: //我们...
  • C++静态成员变量初始化

    千次阅读 2021-06-17 10:35:00
    静态成员变量可以初始化,但只能在体外进行初始化。如: long long student::number = 13926572996; //在体外对静态成员变量赋值 其一般形式为: 数据类型 类名::静态成员变量名 = 初值; 不必在初始化...
  • Kotlin类成员初始化顺序

    千次阅读 2020-05-06 00:57:59
    Kotlin实例初始化时,构造函数、成员变量、init块等的初始化顺序必须弄清楚,否则容易出bug: Example: open class Parent { private val a = println("Parent.a") constructor(arg: Unit=println("Parent ...
  • 在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:第一种方法:CMYClass::CSomeClass() { x=0; y=1; }第二种方法:CSomeClass::CSomeClass() : x(0), y(1) { }本文将要探讨这两种方法的...
  • c++成员变量初始化总结

    千次阅读 2019-06-14 17:04:11
    首先把需要初始化成员变量分为几: a.一般变量(int) b.静态成员变量(static int) c.常量(const int) d.静态常量(static const int) 对应的初始化方式是: a.一般变量可以在初始化列表里或者构造...
  • Java中成员变量的初始化过程

    千次阅读 2021-03-09 17:45:24
    Java中的成员变量分为两种:第一种是成员变量,第二种是...1.没有被修饰符修饰的成员变量和局部变量的初始化在java中所有的成员变量都会被系统赋予默认是初始值,这个初始值根据不同的数据类型有着不同的定义:Bool...
  • C++类成员初始化顺序问题

    万次阅读 多人点赞 2017-11-22 21:08:20
    今天刚把买了一个月的剑指offer这本书翻阅一下,看到一个简单的举例。...C++类成员初始化顺序问题1 C++类成员初始化顺序问题2 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下,#include us
  • 我们知道C++的静态成员变量是需要初始化的,但为什么要初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是...
  • Java成员变量初始化顺序

    千次阅读 2018-11-24 22:28:49
    1、变量初始化 变量简单来说就是被static修饰的变量,变量属于本身 1.1 初始化时机 定义变量时指定初始化 静态代码块中对变量指定初始化 1.2 初始化顺序 上述两种方式在程序中的排列顺序即为执行顺序 ...
  • C++中的数据成员如何初始化

    千次阅读 2020-03-10 18:25:10
    C++中的数据成员初始化,首先需要明白在中都有哪些数据成员 const成员:也就是常量成员,它们在声明时就要初始化,因为它们为常量成员,一旦定义,就不能修改 引用成员&:引用代表的就是被引用者自身,是...
  • 成员变量初始化总结

    万次阅读 2015-04-08 11:52:23
    首先把需要初始化成员变量分为几: Ø 一般变量(int) Ø 静态成员变量(static int) Ø 常量(const int ) Ø 静态常量(static const int)  对应的初始化方式是: Ÿ 一般变量可以在初始化列表里或者...
  • c++模板静态成员初始化

    千次阅读 2019-07-03 10:00:11
    template<class T> class ThreadPool { private: unsigned int max_task_number; } template<class T> unsigned int ThreadPool<T>::max_task_number=0; 按照颜色对应修改就可了。......
  • c++static成员变量初始化

    万次阅读 2019-05-10 23:12:38
    今天看到一个写法,竟然不知道这种写法。。。我是不是脑子完犊子了。。。 在test.h文件中: ... //静态数据成员声明 ... //静态数据成员的定义和初始化 ...中的静态成员变量的初始化必须在外实现!! ...
  • 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:  情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);
  • C++11属性成员初始化

    千次阅读 2020-03-29 17:03:50
    还有一些仍旧是初始化。由于可能存在对C++11支持的程度不同,以及编译器厂商是否对C++进行了扩展。下面是我的测试平台: 测试环境 Windows 10的64位操作系统 Microsoft Visual Studio Community 2019 ...
  • C++类成员初始化顺序

    千次阅读 2019-08-10 14:46:48
    注意,对于一个中的变量,初始化的顺序并不是按照初始化成员列表的顺序进行初始化,而是根据中变量定义的顺序来初始化的。比如: 下面一个例子输出应该是多少? class A { private: int n1; int n2; ...
  • 的静态成员变量初始化问题

    千次阅读 2019-08-12 20:24:37
    我们都知道的静态成员变量必须在初始化,不仅如此,的静态成员变量最好在源文件中初始化,而不能在头文件初始化,否则,编译的时候就会报错"symbol multiply defined". 举例: /*--testA.h--*/ class A ...
  • 有关const成员、static成员、const static成员初始化:1、const成员:只能在构造函数后的初始化列表中初始化(C++98); (C++11提供了初始化,因此内常量可在声明时进行初始化,因此该内常量的作用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 768,675
精华内容 307,470
关键字:

初始化类成员