类型名要特殊处理

szn_409 2016-03-19 09:41:09
typedef int Int;
class CTest1
{
public:
CTest1()
{

}

public:
typedef double Int; //书上说这种用法是错的,是么
Int value;
}

如上代码是不是错的
...全文
110 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
szn_409 2016-03-20
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
完全OK啊,这是一个“仅在类内部起作用的类型别名” 如果该语句放在public段中,则可以在类外部使用,而如果放在private段中,则只能在类内使用。 通过限制该类型别名的作用域来防止冲突。比如同样表示长度,可能有的类中只须char即可,有的类中要用int,而有的类可能连long都嫌小。那么,我一概起个别名叫“size”,不同的类中有不同的定义。

#include<iostream>
using namespace std;

typedef int Int;
class CTest1
{
public:
	CTest1(){}
public:
	typedef double Int;   
	Int value;
};
int main()
{
	CTest1::Int a = 1.1;
	cout << a << endl;
	Int b = 1.1;
	cout << b << endl;
	system("pause");
}
引用 1 楼 qq423399099 的回复:
完全OK啊,这是一个“仅在类内部起作用的类型别名” 如果该语句放在public段中,则可以在类外部使用,而如果放在private段中,则只能在类内使用。 通过限制该类型别名的作用域来防止冲突。比如同样表示长度,可能有的类中只须char即可,有的类中要用int,而有的类可能连long都嫌小。那么,我一概起个别名叫“size”,不同的类中有不同的定义。

#include<iostream>
using namespace std;

typedef int Int;
class CTest1
{
public:
	CTest1(){}
public:
	typedef double Int;   
	Int value;
};
int main()
{
	CTest1::Int a = 1.1;
	cout << a << endl;
	Int b = 1.1;
	cout << b << endl;
	system("pause");
}
书上原话: 一般来说内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内存作用域中使用过,然而在类中 如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字。 书上源码: typedef double Money; class Account { public: Money Balance(){return bal;}//使用外层作用域的Money private: typedef double Money; //错误不能重新定义Money Money bal; }; 书为:C++Primer第五版 中文版 第255页
paschen 版主 2016-03-20
  • 打赏
  • 举报
回复
The typedef-names are aliases for existing types, and are not declarations of new types. Typedef cannot be used to change the meaning of an existing type name (including a typedef-name). Once declared, a typedef-name may only be redeclared to refer to the same type again. Typedef names are only in effect in the scope where they are visible: different functions or class declarations may define identically-named types with different meaning. http://en.cppreference.com/w/cpp/language/typedef
paschen 版主 2016-03-20
  • 打赏
  • 举报
回复
这几个代码都没问题 假如是这样的代码

typedef int Money;
class Account
{
public:
	Money Balance(){return bal;}//使用外层作用域的Money
private:
	typedef double Money;    //错误不能重新定义Money
	Money bal;
};
void main()
{
	Account aa;
}
那么bal的类型为double,Balance()函数的返回类型确是int
NOTHING_____ 2016-03-20
  • 打赏
  • 举报
回复
书上最后还有一段话:尽管重新定义类型名字是一种错误的行为,但是编译器并不为此负责。一些编译器仍将顺利通过这样的代码,而忽略代码有错的事实。
szn_409 2016-03-20
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
没有问题,他们作用域不同 而且你类中的value是double类型 如果写成:

typedef int Int;

class CTest1
{
public:
	CTest1()
	{

	}
public:
	Int value;
	typedef double Int;    //书上说这种用法是错的,是么
};
vlaue是int类型
首先 ,编译你这段代码也不会出错,是对的还是错的? 其次,书上原话: 一般来说内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内存作用域中使用过,然而在类中 如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字。 书上源码: typedef double Money; class Account { public: Money Balance(){return bal;}//使用外层作用域的Money private: typedef double Money; //错误不能重新定义Money Money bal; }; 书为:C++Primer第五版 中文版 第255页
paschen 版主 2016-03-20
  • 打赏
  • 举报
回复
没有问题,他们作用域不同 而且你类中的value是double类型 如果写成:

typedef int Int;

class CTest1
{
public:
	CTest1()
	{

	}
public:
	Int value;
	typedef double Int;    //书上说这种用法是错的,是么
};
vlaue是int类型
小灸舞 2016-03-19
  • 打赏
  • 举报
回复
完全OK啊,这是一个“仅在类内部起作用的类型别名”
如果该语句放在public段中,则可以在类外部使用,而如果放在private段中,则只能在类内使用。
通过限制该类型别名的作用域来防止冲突。比如同样表示长度,可能有的类中只须char即可,有的类中要用int,而有的类可能连long都嫌小。那么,我一概起个别名叫“size”,不同的类中有不同的定义。

#include<iostream>
using namespace std;

typedef int Int;
class CTest1
{
public:
CTest1(){}
public:
typedef double Int;
Int value;
};
int main()
{
CTest1::Int a = 1.1;
cout << a << endl;
Int b = 1.1;
cout << b << endl;
system("pause");
}

64,635

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧