将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?

Posted

技术标签:

【中文标题】将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?【英文标题】:assign an int(eg. 10) to a string member in a struct in c++, why it compile success?将一个int(例如10)分配给c ++中结构中的字符串成员,为什么它编译成功? 【发布时间】:2021-10-02 23:37:27 【问题描述】:

我正在为第 5 章 ex01 练习 : 编写一个名为 Lib 的结构,其中包含三个字符串对象 a、b 和 c。 在 main() 中创建一个名为 x 的 Lib 对象并分配给 x.a、x.b 和 x.c。 打印出值。

一开始,我正在尝试:

// ex02.cpp
#include <iostream>
#include <string>
using namespace std;

struct Lib 
    string a;
    string b;
    string c;
;

int main()
    Lib x;
    x.a = 1;    // here I forgot the string object, and incorrectly assign the wrong value to x.a
    x.b = 2;
    x.c = 3;
    cout << x.a << " " << x.b << " " << x.c << endl;
    return 0;

可以编译成功,但是运行结果好像只有两个空格:

[root@VM-0-2-centos ch05]# g++ ex02.cpp 
[root@VM-0-2-centos ch05]# ./a.out 
  
[root@VM-0-2-centos ch05]# 

此时我发现了错误的分配。但为什么它不应该给出编译错误? 当我将分配修改为以下内容时:

    x.a = "hello";     
    x.b = "world";
    x.c = "welcome";

编译成功,并给出正确的运行结果:

[root@VM-0-2-centos ch05]# g++ ex02.cpp 
[root@VM-0-2-centos ch05]# ./a.out 
hello world welcome
[root@VM-0-2-centos ch05]# 

我的问题是为什么 x.a = 1 可以编译成功? 当我尝试时:

string test = 1;

编译会报错:

error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]

【问题讨论】:

【参考方案1】:

你需要自己验证我的陈述。查看字符串代码。 首先,当你声明 Lib x 时,x (a, b, c) 的成员将调用字符串构造函数。所以当给x(x.a = 1)的成员赋值时,会调用"=operation"。

但是,string test = 1,它会调用构造函数。

最大的区别是调用者。字符串构造函数的参数类型为“const char*”,但“=operation”可以获取其他类型的参数。因此,编译时的 x.a = 1 正在传递。 注意,“int”默认会强制转换为某种类型。

【讨论】:

【参考方案2】:

谢谢,@Muqali He,你给了我提示和方向。 我尝试从这里理解字符串类:https://www.cplusplus.com/reference/string/string/operator=/ 我明白了一点。 对于c++98,当我使用“=”时,有三个重载成员函数:

当我尝试时:

string t2;
t2 = "test";

没关系。我尝试:

string t3;
t3 = 256;

它会收到警告:

warning: overflow in implicit constant conversion

此时,256 将被识别为字符。当你输出这个值时,它会转换成它的 ASCII 码:

string t4;
t4 = 100;
cout << "t4= " << t4 << endl;

输出是

t4 = d

如果我尝试:

string t5 = 100;    // it will compile error

因为没有对应的构造函数

【讨论】:

以上是关于将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?的主要内容,如果未能解决你的问题,请参考以下文章

C中结构中的指针-如何将给定的void指针的值分配给结构中的指针[关闭]

如何将 int 的数字分配给数组 c++

欺骗C编译器将整个结构分配为零,没有for循环[重复]

在 C 中的结构中填充

如何将结构中的 void 指针分配给另一个结构?

将16个团队中的随机团队分配给8个人中的一个随机人[重复]