我正在尝试使用指针 - 你知道实验。
如果删除名称和解引用的指针,我的代码将正常工作
this->name
。但我真的不会学习任何东西。
// Example program
#include <iostream>
#include <string>
using namespace std;
string dogsbreed[3];
struct dog
{
string *name;
string breed;
int age;
void set_dogs_breed()
{
dogsbreed[0] = "Collie";
dogsbreed[1] = "Poodle";
dogsbreed[2] = "Pit Ball";
}
void set_dog_name(string names)
{
*this->name = names;
}
string get_dog_name()
{
return *this->name;
}
};
int main()
{
dog doggies;
doggies.set_dogs_breed();
doggies.set_dog_name("Socks");
doggies.get_dog_name();
}
关于
void set_dog_name(string names)
{
*this->name = names;
}
一切正常 - 有道理,名字是指针,我在set_dog_breed()
中取消引用名称并更改其价值。
string get_dog_name()
{
return *this->name;
}
原因
29:23:警告:&#39;狗狗&#39;可以在此功能中使用未初始化 [-Wmaybe-未初始化] 35:9:注意:&#39;狗狗&#39;在这里宣布
好的小狗是没有初始化的,但是当我没有使用指针时,编译器并不介意 - 我不清楚为什么要这样做,或者即使这是实际问题。
答案 0 :(得分:1)
警告消息正确,doggies
对象 未初始化,您永远不会初始化必须在构造函数中完成的成员变量。
由于您没有初始化对象,因此成员变量name
将具有 indeterminate 值,并以任何方式使用该变量,除了初始化它将导致未定义的行为。
编译器不会阻止你做坏事,它可能会检测到它们,但它不需要对它做任何事情。而且C ++也没有任何类型的运行时检查,编译器和运行时系统会很乐意让你自己开枪。
此外,如果您主要使用取消引用运算符来访问指针,那么您可能首先不需要指针。
答案 1 :(得分:0)
成员string *name
没有为其分配内存。因此,您在set_dog_name
内会遇到细分错误,您可以在其中为其指定另一个string
。
此外,您不会在类中或构造函数中初始化成员。这可能是编译器指出的。但是,GCC 5.2不会显示-Wall
和-Wextra
的警告或错误。我在运行程序时遇到分段错误。现场演示here。
<强>除了:强>
初始化全局dogsbreed
数组绝不是struct
的关注点。相反,您可以将变量设为struct
的{{3}}并单独初始化。
struct dog {
static string dogsbreed[3];
};
string dog::dogsbreed[3] = { "Collie", "Poodle", "Pit Ball" } ;