对象数据成员自动实例化

时间:2014-09-11 19:51:09

标签: c++

我在我的代码中得到了这个超级bazar bug,我无法弄明白。基本上发生了什么是数据成员'char_string'正在创建,我甚至没有为它分配任何东西。它打印出“test123”,当在process.cpp文件中时,我还没有将数据复制到它。

的main.cpp

#include <iostream>
using namespace std;
#include "process.h"



int main(){

    char string[] = "test123";

    w1::CString test(string);


    return 0;
}

process.h

#ifndef PROCESS_H
#define PROCESS_H

namespace w1{

    class CString{

        private:

            int num_of_chars;
            char char_string[];

        public:
            CString(char *);

    };

}

#endif

process.cpp

#include <iostream>
#include "process.h"

w1::CString::CString(char * c_string){

    std::cout << char_string << std::endl;
}

输出:

test123

1 个答案:

答案 0 :(得分:1)

没有实例化。根据{{​​3}},

  

对于基本类型的成员,它没有区别   定义了构造函数之上的方法,因为它们不是   默认情况下初始化,但对于成员对象(类型为a的那些对象)   如果他们没有在冒号后初始化,他们是   缺省构造。

指针(以及数组)是基本类型,因此如果未初始化,它们不是默认构造的。它们将指向某个内存位置,使用该位置将导致未定义的行为。在这种情况下,您看到它恰好指向实际(和相关)内存位置,但它可以很容易地指向0(nullptr)或任何其他值。您可能需要查看编译器的内部以了解原因,但通常您不应该依赖于此类未定义的行为。