找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1151|回复: 9

关于string类

[复制链接]
发表于 2009-11-4 00:41:29 | 显示全部楼层 |阅读模式 IP:江苏扬州
c++primer上说,由于历史原因以及为了与c语言兼容,字符串字面值与标准库string类型不是同一种类型,不知该怎么理解,谁能举例说明一下吗?string s("aa") 和 string s = "aa"是不是都支持?有何不同。。
发表于 2009-11-4 00:41:30 | 显示全部楼层 IP:江苏扬州
支持,string是一个类,第一个string s("aa")是调用带参数的构造函数,第二个用的是操作符重载。
回复

使用道具 举报

发表于 2009-11-4 00:41:31 | 显示全部楼层 IP:江苏扬州
就所知的一方面给出我的理解好了:
 上述两种情况都是支持的
 string s("aa");//其中具体的实现,应该调用了其默认的构造函数 string(char *str),从而使初始化得到实现
 而string s="aa";//会调用拷贝函数 string(const string &),且有一次C字符串到string 的转型发生...

另外,两者的区别还在于string 变量的值不会以'\0 '结尾!


 
  
回复

使用道具 举报

发表于 2009-11-4 00:41:31 | 显示全部楼层 IP:江苏扬州
真是不好意思,是我头脑有些混乱了...
string s="aa";// 再想想,也好象只能使用对操作符 = 的重载来实现呀...
希望对楼主有那么一点帮助,惭愧之致,共同学习了.
回复

使用道具 举报

发表于 2009-11-4 00:41:32 | 显示全部楼层 IP:江苏扬州
晕了
有误导的意思
这样
如果你有String(const char*s)
那么string s="aa";// 会直接调用这个拷贝构造函数
这里=与()是等价的
而不会去调用=运算符
楼主:你的那俩个是等价的
(我不知道string的原代码,但是那两个函数都会调用构造函数)
回复

使用道具 举报

发表于 2009-11-4 00:41:33 | 显示全部楼层 IP:江苏扬州
感谢大家的回答,我的程序部分代码是这样的,,
#include<iostream>
#include<memory>
#include<stdexcept>
#include<string>
using namespace std;
class Exce : public runtime_error {
public:
Exce( int val, const string & s = "aa" ) ://这了采用复制初始化,编译通过
_val( val ), runtime_error( s ){ }
int value() { return _val; }
private:
int _val;
};
Exce a(12, "bb");
//此处声明一个对象,编译没问题,但是如果构造函数里s="aa"写成s("aa")就行不通,编译器提示:no matching function for call to 'Exce::Exce(int ,const char[3]),
candidates are: Exce::Exc(const Exce&)
Exce::Exc(int)
而在s("aa")时,若声明对象形如 Exce a(12);则没有问题,c++primer上说变量初始化分直接初始化s("aa")和复制初始化s="aa",而在函数形参表里一般只能用复制初始化,但在直接初始化下有人用GCC3.4编译通过了,不知是不是有编译器支持直接初始化。
所以我现在疑惑到底是哪边出了问题,仅仅是不符合参数表定义形式吗?

请大家帮忙分析一下,。。。
回复

使用道具 举报

发表于 2009-11-4 00:41:35 | 显示全部楼层 IP:江苏扬州
以下是引用song4在2006-10-21 10:36:06的发言:

晕了
有误导的意思
这样
如果你有String(const char*s)
那么string s="aa";// 会直接调用这个拷贝构造函数
这里=与()是等价的
而不会去调用=运算符
楼主:你的那俩个是等价的
(我不知道string的原代码,但是那两个函数都会调用构造函数)
正确的,说string s="sdfds",是 赋值运算 符=重载是不对的!!
回复

使用道具 举报

发表于 2009-11-4 00:41:36 | 显示全部楼层 IP:江苏扬州
你再写一个fn(m_int(8))
试一试不就知道了
回复

使用道具 举报

发表于 2009-11-4 00:41:37 | 显示全部楼层 IP:江苏扬州
试了试,看来的确只是参数列表形式问题
回复

使用道具 举报

发表于 2009-11-4 15:05:11 | 显示全部楼层 IP:澳大利亚
这个贴不错!!!!!看了之后就要回复贴子,呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 07:45 , Processed in 0.195577 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表