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

时间:2010-05-16 18:41:49

标签: c++ string pointers operator-overloading

我正在创建自己的字符串class,我想确保CString a = "Hello " + "World!";有效(即不会产生编译错误,例如:cannot add 2 pointers)。

我的字符串class会在需要时自动转换为char*,因此编写printf(a)不会破坏代码。

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

2 个答案:

答案 0 :(得分:9)

你不能完全,因为你只能为类类重载运算符,而字符串文字没有类类型。

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

CString a = "Hello " "World!";

或者您可以创建一个CString临时文件并附加到其中:

CString a = CString("Hello ") + "World!";

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

CString a("Hello ", "World!");

答案 1 :(得分: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 ;
}

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

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

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

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

class StringThinWrapper
{
   public :

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

   private :
      const char * const m_p ;
} ;

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

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

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

现在,让我们使用包装器编写一个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 ;
}

编译并给出以下结果:

  

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); 
}

你将使用它:

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

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

   return 0 ;
}

有关详细信息,请参阅以下SO问题: What new capabilities do user-defined literals add to C++?