| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 783 人关注过本帖
标题:关于string类
只看楼主 加入收藏
adaliuliu
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-8-21
收藏
 问题点数:0 回复次数:8 
关于string类

c++primer上说,由于历史原因以及为了与c语言兼容,字符串字面值与标准库string类型不是同一种类型,不知该怎么理解,谁能举例说明一下吗?string s("aa") 和 string s = "aa"是不是都支持?有何不同。。

搜索更多相关主题的帖子: string类 primer c语言 类型 何不同 
2006-10-20 11:22
jiangzw625
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2006-3-27
收藏
得分:0 

支持,string是一个类,第一个string s("aa")是调用带参数的构造函数,第二个用的是操作符重载。

马马乎乎
2006-10-20 22:35
C_ray
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-17
收藏
得分:0 
就所知的一方面给出我的理解好了:
 上述两种情况都是支持的
 string s("aa");//其中具体的实现,应该调用了其默认的构造函数 string(char *str),从而使初始化得到实现
 而string s="aa";//会调用拷贝函数 string(const string &),且有一次C字符串到string 的转型发生...

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


 
  

2006-10-20 22:50
C_ray
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-17
收藏
得分:0 

真是不好意思,是我头脑有些混乱了...
string s="aa";// 再想想,也好象只能使用对操作符 = 的重载来实现呀...
希望对楼主有那么一点帮助,惭愧之致,共同学习了.

2006-10-20 23:30
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

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


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-10-21 10:36
ada_liu
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-8-21
收藏
得分:0 

感谢大家的回答,我的程序部分代码是这样的,,
#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编译通过了,不知是不是有编译器支持直接初始化。
所以我现在疑惑到底是哪边出了问题,仅仅是不符合参数表定义形式吗?

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

2006-10-21 13:45
liyanguestc
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2005-5-15
收藏
得分:0 
以下是引用song4在2006-10-21 10:36:06的发言:

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

正确的,说string s="sdfds",是 赋值运算 符=重载是不对的!!


2006-10-21 20:15
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

你再写一个fn(m_int(8))
试一试不就知道了


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-10-22 09:23
adaliuliu
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-8-21
收藏
得分:0 
试了试,看来的确只是参数列表形式问题
2006-10-23 09:22
快速回复:关于string类
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011630 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved