我正在尝试使用+连接字符串,但是有一些奇怪的东西在继续。这是我为课堂项目提供的“成绩”课程:
#pragma once
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Grade {
private:
string className;
string student;
string letter;
public:
Grade(string c, string s, string l) : className(c), student(s), letter(l) {}
string getLetterGrade() const { return letter; }
string getClassName() const { return className; }
string getStudent() const { return student; }
void setLetterGrade(string l) { letter = l; return;}
void setClassName(string c) { className = c; return;}
void setStudnet(string s) { student = s; return;}
string toString() const { string output = "hello"+student; return output; }
};
显然,toString()方法目前不是我想要的。 如果我按上面那样运行toString(),我会按预期得到“hello529173860”。但是,如果我将行更改为:
string toString() const { string output = student+"hello"; return output; }
然后输出为“hello3860”。这不只是将hello字符串放在前面,而是在过程中用学生字符串替换字符......不知怎的?
此外,如果我尝试使用:
string toString() const { string output = "hello"+" world"; return output; }
我收到错误:
Grade.h: In member function ‘std::string Grade::toString() const’:
Grade.h:29:53: error: invalid operands of types ‘const char [6]’ and ‘const char [7]’ to binary ‘operator+’
string toString() const { string output = "hello"+" world"; return output; }
^
我真的对这里发生的事情感到茫然...特别是因为我在程序的早期没有问题就完成了字符串连接。 我想要的是输出如下内容:
“学生+ [一些空格] +字母+ [一些空格] + className”
答案 0 :(得分:8)
可以将std::string
添加到任何内容(另一个std::string
,双引号字符串文字,char
)并提供直观的结果 但 如果您尝试将双引号字符串文字添加到另一个字符串文字或char
,那么它将无法“正常工作”:
添加到char
或其他整数值的字符串文字将经历标准转换为const char*
,然后添加到指针的任何数字都将沿着字面数移动:如果偏移量不在字符串文字内,那么如果取消引用(使用)结果指针,则会得到未定义的行为,
即使在衰减到两个指针之后也无法添加两个字符串文字,因此您将收到编译时错误。
有时您会想要显式构建std::string
,以便与其他值的连接按您的方式工作:例如: my_string = std::string("hello ") + my_const_char_ptr + '\n'
。
示例:
std::string s = "Hello";
s + " World"; // ok
"Hello " + s; // ok
"Hello " + "World"; // NOT ok - two string literals
s += " World"; // ok
s += " Goodbye " + "World"; // NOT ok - "+" evaluated before "+="
s += std::string(" Goodbye ") + "World"; // OK - right-hand-side no longer two literals
// BUT may be slower than two "s +="
答案 1 :(得分:1)
字符数组没有运算符+所以很明显这个代码
string toString() const { string output = "hello"+" world"; return output; }
无效。
至于其他问题,这只是你的幻想,因为你甚至没有为自己做出证明问题的榜样。
答案 2 :(得分:0)
常量字符串"hello"
和"world"
只是类型const char*
的编译时常量。就像你不能添加两个int
指针一样:
int *p1, *p2;
p1+p1; // Error
您无法添加两个(const) char*
个对象。这违反了C / C ++语言规则。如果必须连接两个const-char-pointers,可以将它们放在一起:
"hello" "world"
如果将这些技术与宏一起使用,则此技术非常有用。例如:
// Over simplified
#define ONE(_x) _x
#define TWO(_x) _X
ONE("This is") TWO(" concatenation")
如果要添加两个(或更多)运行时C字符串,则必须使用strXXX
函数(如strcat
),或者更好地使用std::string
。