c++类型转换问题and 一个看不懂的problem
1)operator char*() const{return s;}
其中s是自定义的一个string类中的char* s;
对这行代码的解释是对char* 类型的转换意味着在任何需要char*的地方都可以使用一个
string对象。//请问这句话怎么理解。
2)有一个这样的:
#define CLASS(ID) class ID{\
public:\
ID(int)(out<<#ID"constructor\n";}\
~ID(){out<<#ID"destructor\n";}\
};
请问这里面的\和#(#ID)分别代表什么意思?
问题点数:20、回复次数:7Top
1 楼kof99th(小虫)回复于 2002-05-16 09:53:32 得分 3
1。当需要一char*对象的时候你用一个string 对象,编译器会调用operator char*()进行隐式转换,使类型匹配。
2。\是续行符,‘#’不清楚,好象是把两个字符串连接在一起。Top
2 楼blactte(想认识我吗?在靠近一点!)回复于 2002-05-16 10:05:13 得分 0
1:operator char*() const{return s;}
这是运算符重载.也就是说
如果定义
String str;
char *ch;
str=ch;//String类定义的赋值重载运算符可以将char* 转化成String
ch=str;//char没有定义赋值重载运算符不能转换,但是定义了operator char*() const{return s;}这里首先将str转换成char*,再赋值.
2:
#define CLASS(ID) class ID
{
public:
ID(int)(cout<<"#IDconstructor\n";}
~ID(){cout<<"#IDdestructor\n";}
};
这个代码是那里的?
我只能将上述代码这么理解.
Top
3 楼blactte(想认识我吗?在靠近一点!)回复于 2002-05-16 10:05:55 得分 6
1:operator char*() const{return s;}
这是运算符重载.也就是说
如果定义
String str;
char *ch;
str=ch;//String类定义的赋值重载运算符可以将char* 转化成String
ch=str;//char没有定义赋值重载运算符不能转换,但是定义了operator char*() const{return s;}这里首先将str转换成char*,再赋值.
2:
#define CLASS(ID) class ID
{
public:
ID(int)(cout<<"#IDconstructor\n";}
~ID(){cout<<"#IDdestructor\n";}
};
这个代码是那里的?
我只能将上述代码这么理解.
Top
4 楼fengye()回复于 2002-05-16 10:08:41 得分 1
#ID means the literal string of ID
#define I(ID) int ID
#define P(ID) printf(#ID)
A(a);
P(a);
is expand to:
int a;
printf("a");Top
5 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-05-16 10:11:36 得分 2
带'#'就代表好像变量一样,实际运算时会进行替换,#ID就代表实际运算的时候会用ID的值来代替#ID。Top
6 楼fengye()回复于 2002-05-16 10:12:55 得分 1
in your example, if you write CLASS(MyClass), then
ID is MyClass
#ID is "MyClass"
#ID"destructor\n" is "MyClass""destructor\n" which will be concatenated to "MyClassdestructor\n"
Top
7 楼tiger_net()回复于 2002-05-16 16:58:05 得分 3
1. 是操作符重载. 一个例子.
CString objS = "123456";
char* pS;
pS = (char *) objS;
重载的目的就是让这样的操作也可以.
2. MSDN例子,看了就明白了, 还有#@ ## , #@是用' ' 括起来, ##是把两个参数连起来.
#define stringer( x ) printf( #x "\n" )
void main()
{
stringer( In quotes in the printf function call\n );
stringer( "In quotes when printed to the screen"\n );
stringer( "This: \" prints an escaped double quote" );
}
Such invocations would be expanded during preprocessing, producing the following code:
void main()
{
printf( "In quotes in the printf function call\n" "\n" );
printf( "\"In quotes when printed to the screen\"\n" "\n" );
printf( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
When the program is run, screen output for each line is as follows:
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \" prints an escaped double quotation mark
Top
8 楼lanzhengpeng2(兰征鹏)回复于 2002-05-17 10:03:17 得分 4
#ID将传入的宏变量转化为字符串。
define CLASS(ID) class ID{\
public:\
ID(int)(out<<#ID"constructor\n";}\
~ID(){out<<#ID"destructor\n";}\
};
Exmple:
CLASS(Test)成为:
class Test
{
public:
Test(int){cout << "Test""constructor\n';}
~Test(){cout << "Test""destructor\n";}
};
##是连接符号
#define LINK(a,b) a##b
LINK(Test,Test)成为TestTestTop




