CString a ="Hello"+"World!"; 可能吗?

San*_*099 2 c++ string pointers operator-overloading

我正在制作自己的字符串class,我想确保CString a = "Hello " + "World!";工作(即不会给编译器错误,如:)cannot add 2 pointers.

我的字符串classchar*在需要时自动转换,因此写入printf(a)不会破坏代码.

有没有办法替换字符周围的编译器行为?(即在引号之间"abc").或者,或者,更改+操作符的行为以处理字符串

Jam*_*lis 9

你不能这样做正是因为你只能重载类类型的运算符,和文字字符串没有类类型.

您可以利用在预处理期间发生的字符串文字的串联:

CString a = "Hello " "World!";
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一个CString临时的并附加到它:

CString a = CString("Hello ") + "World!";
Run Code Online (Sandbox Code Playgroud)

或者你可以有一个带有CString多个参数的构造函数:

CString a("Hello ", "World!");
Run Code Online (Sandbox Code Playgroud)


pae*_*bal 6

正确的答案

不能.您不能为内置函数重载运算符,例如指针.

James McNellis已经回答了这个问题,所以我不会详细说明.

可能的选择......

(我使用std :: string,因为我的内部字符串没有信息)

使用typedef会在语法中添加一些糖:

typedef std::string S_ ;

int main(int argc, char* argv[])
{
   std::string s = S_("Hello") + S_(" World") ;

   std::cout << "s : " << s << std::endl ;

   return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不会用一个两个字符的符号污染全局命名空间只是为了一点点糖......据我所知,代码效率低下(创建了两个字符串对象,加上一个临时对象,不保证编译器将它全部优化...)

出于好奇心的缘故......

作为一个好奇心,通过将字符串包装成一个瘦的类,你可以"添加"这两个指针.

首先,让我们创建包装器:

class StringThinWrapper
{
   public :

      StringThinWrapper(const char * p) : m_p(p) {}
      operator const char * () const { return m_p ; }

   private :
      const char * const m_p ;
} ;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它既是内联的,也不会做任何事......但是,它能够将自己转换为const char*指针(这种黑客很危险,所以要确保它是你想要做的).

然后,对于这个包装器,让我们重载加法运算符:

inline std::string operator + (const StringThinWrapper & lhs, const StringThinWrapper & rhs)
{
   std::string s(lhs) ;
   s += rhs ;
   return s ;
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们main使用包装器编写一个函数,typedefed易于使用:

typedef StringThinWrapper S_ ;

int main(int argc, char* argv[])
{
   std::string s = S_("Hello") + S_(" World") ;

   std::cout << "s : " << s << std::endl ;

   return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

编译并给出以下结果:

s:Hello World

免责声明:我只想玩你的问题给我的想法,并与你分享.不要因为可以而应用这种代码.实际上,这个代码应该被改进以便在被使用之前有效地覆盖所有情况,即使这样,一个简单的typedef std::string S_ ;将是更好的恕我直言.

AFAIK,我不会使用它,因为我对当前的STL API感到满意.

那么C++ 0x怎么样?

在C++ 0x中,您将能够创建自己的文字.代码有点像:

std::string operator "str"(const char * p)
{ 
    return std::string(p); 
}
Run Code Online (Sandbox Code Playgroud)

你将使用它:

int main(int argc, char * argv[])
{
   std::string s = "Hello"str + " World"str ;

   std::cout << "s : " << s << std::endl ;

   return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅以下SO问题: 用户定义的文字为C++添加了哪些新功能?.