C++ 为什么我的C++;程序在使用空对象时自动退出? 字符串n=NULL; cout
您应该让C++ 为什么我的C++;程序在使用空对象时自动退出? 字符串n=NULL; cout,c++,C++,您应该让n保持未初始化状态,而在C++11中将其赋值为NULL可能会导致未定义的行为。不应该有一个实例需要将其赋值为NULL。您的程序可以自由执行您选择的std::string的任何实现std::string有一个构造函数采用const char*s。然而,这涉及: 使用由s指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果s未指向图表的至少Traits::length(s)+1元素的数组,则行为未定义,包括s为空指针的情况。 (强调矿山) 通过可以看
n
保持未初始化状态,而在C++11中将其赋值为NULL可能会导致未定义的行为。不应该有一个实例需要将其赋值为NULL。您的程序可以自由执行您选择的std::string
的任何实现std::string
有一个构造函数采用const char*s
。然而,这涉及:
使用由s
指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果s
未指向图表的至少Traits::length(s)+1
元素的数组,则行为未定义,包括s为空指针的情况。
(强调矿山)
通过可以看到,当默认构造(如std::string n;
)为空时,使用空ptr初始化字符串会导致未定义的行为astd::string
对象。如果需要空字符串,只需创建对象,无需进行特殊或显式初始化。@NathanOliver问题不在于NULL是指针。这是因为它是空指针。@NathanOliverstd::string
可以用指针初始化。C++允许转换构造函数。代码> N< /代码>不会是统一的,因为它是类类型。它的构造函数将正确地将其初始化为空字符串。即使NULL没有与之关联的类型(除了void*
),这是否正确?我相信NULL将被转换为字符,然后被分配给字符串。@ThomasMatthewsvoid*
ofNULL
选择const CharT*
重载。
string n = NULL;
cout << "blah: " << n << " foo!" << endl; // never printed
cout << "BLAH" << endl; // never printed
cerr << "FOO" << endl; // never printed