社区
C++ 语言
帖子详情
string作为成员为何不能被操作?
cimstu
2008-02-22 04:32:07
我的代码如下
A.h
#include <string>
using namespace std;
class A
{
private:
string m_mystr;
public:
getstr(string str);
}
A.cpp
A::getstr(string str)
{
m_mystr = str;
}
上边的代码编译的时候可以通过,运行时会出错,而且不光是不能赋值,对m_mystr的任何操作都会出错,请问我是遇到了什么高深的问题吗?
...全文
193
13
打赏
收藏
string作为成员为何不能被操作?
我的代码如下 A.h #include using namespace std; class A { private: string m_mystr; public: getstr(string str); } A.cpp A::getstr(string str) { m_mystr = str; } 上边的代码编译的时候可以通过,运行时会出错,而且不光是不能赋值,对m_mystr的任何操作都会出错,请问我是遇到了什么高深的问题吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cimstu
2008-03-03
打赏
举报
回复
很感动大家能这样关心我的string,呵呵我发现错误在哪里了,上边的代码是我现编的,就是那么个意思。如果上边的语法无误的话。其实应该是可以正确赋值的。我的错误是你们谁也想不到的,呵呵就不再那出来逗大家乐了。感谢!
九个太阳2023
2008-02-26
打赏
举报
回复
8楼的解释的很详细了,不需要再补充什么了~~~
tsst
2008-02-26
打赏
举报
回复
楼主的写法有问题,基础知识不扎实!呵呵!潜力很大
fish6344
2008-02-26
打赏
举报
回复
的确如此,getstr有误导语意。
周成风
2008-02-26
打赏
举报
回复
都是猛男。。
建议函数名getstr改为setstr,我看着总以为你是要得到值。。
ShardowM
2008-02-25
打赏
举报
回复
class定义后应该加分号,getstr函数没有返回值。
fish6344
2008-02-25
打赏
举报
回复
把你贴子中的类声明稍作完善,粘贴到我的几个编译器上:
class A//没有构造函数(当然也不需要)!在A实例化时,m_mystr是一个空的string实例(缓冲区无字符)
{
private:
string m_mystr;
public:
getstr(string str);
};//完善一:加';'!
A::getstr(string str)
{
m_mystr = str;
cout << m_mystr << endl;//完善二:纯演示赋值操作结果!
}
在如下程序中:
int main(void)
{
string _s("Good!");
A _a;
_a.getstr(_s);//输出"Good!"!
_PAUSE;
return 0;
}
BC6.0编译器仅有一个警告"W8070 Function should return a value",程序经编译链接,正常运行;
VC7.1编译器同上,警告" warning C4183: “getstr”: 缺少返回类型;假定为返回“int”的成员函数",程序经编译链接,正常运行;
上述二个编译器仅按语言规则,视你的getstr函数因无返回值类型声明而使用缺省的返回值类型,就是int!只是给与程序设计层面以警告,而顺利编译链接,正常运行!
在GCC编译器上,上述未指定返回值的问题,造成编译时错误而不能Build,这是因为GCC尊从C++98标准给与上述代码以否决!在此,为getstr函数加上一个返回值类型,例如:
class A
{
private:
string m_mystr;
public:
void getstr(string str);//增加返回值类型声明;
};
void A::getstr(string str));//增加返回值类型声明;
{
m_mystr = str;
cout << m_mystr << endl;
}
上述程序一如BC和VC编译器,顺利编译链接,正常运行!
综上所述,string作为类成员并非如你所说:"不能被操作?"!string作为STL一部份,其实现目标就是为了使string象其它C++内建类型一样,安全、方便!(见《C++标准程序库》page471)因此,作为类成员的string对象变量,具有良好的可操作性。
hemu1190
2008-02-25
打赏
举报
回复
建议多看看书吧!
visame
2008-02-22
打赏
举报
回复
对呀,这个程序肯定不能同过编译,除非你的编译器有问题.
至少两处错误:class定义后应该加分号,getstr函数没有返回值。
理论上应该不会出现别的问题。除非你的编译器有问题。
ssdx
2008-02-22
打赏
举报
回复
我觉得楼主,你最好把你完整的代码帖出来。
Treazy
2008-02-22
打赏
举报
回复
函数的返回值在哪?
gccli
2008-02-22
打赏
举报
回复
不知你的A.cpp里有没有
#include "A.h"
还有class A{
};//要以';'结束
还有,C++有一种“迟缓型错误检测”机制,所以有时候编译时不一定检查出,只有运行时被触发后在能检测出来。
“迟缓型错误检测”,这是提高程序性能的一种策略。
ltc_mouse
2008-02-22
打赏
举报
回复
class A{
...
public:
getstr(string str); //这样可以编译通过?Dev C++提示需要返回值...
};
增加void返回值后,测试代码如下,Dev C++是正常的
A test;
test.getstr(string("Hello"));
Java中的
String
主要讲解
String
类型的不可变性,里面的方法,==等
结构体中
string
类型
成员
结构体中
string
类型
成员
如何理解
String
类型值的不可变?
1.什么是不可变?
String
不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl*,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2.
String
为什么不可变? 翻开JDK源码,java.lang.
String
类起手前三行,是这样写的: public final class
String
implements java.io.Serializable, Comparable<
string
>, CharSequence{ .
Java为什么吧
String
设计为不可变类?
由于字符串无论在任何 Java 系统中都广泛使用,会用来存储敏感信息,如账号,密码,网络路径,文件处理等场景里,保证字符串
String
类的安全性就尤为重要了,如果字符串是可变的,容易被篡改,那我们就无法保证使用字符串进行
操作
时,它是安全的,很有可能出现 SQL 注入,访问危险文件等
操作
。由于
String
天然的不可变,当一个线程”修改“了字符串的值,只会产生一个新的字符串对象,不会对其他线程的访问产生副作用,访问的都是同样的字符串数据,不需要任何同步
操作
。当字符串不可变时,字符串常量池才有意义。
c++模板类
string
成员
函数
c++在c语言的基础上扩展了对于字符串的支持,使其使用方式更加多样化,使用者可以根据实际需要选择最佳的使用方式,具有更强的可
操作
性。 c++继承了c语言中的c风格字符串,并开发出了内置的
string
类。c语言标准函数库中提供了大量的函数用来
操作
以’\0’结尾的字符串,比如strcpy、strlen、strcmp、strcat等。c++继续支持这些函数,并且在
string
类中提供了功能与之一样的
成员
函数,另外还增加了一些其他的功能。 一.
string
类构造函数
string
类提供了多个构造函数,可以根据数据需
C++ 语言
64,849
社区成员
250,501
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章