c++的类中typedef的作用
2015-08-13 01:09
183 查看
typedef long INDEX 给long这样的类型起别名,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度),
但是现在了解到可以在class类里面使用(并且还有public,private之分哦) C++引入“仅在类内部起作用的类型别名”的初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。在函数体内部typedef,这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。
c中有了#define 为什么还要typedef就是为了增强安全和健壮性
随便记录下c中的常量(#define pi = 3.14)和c++中的常量(const double pi = 3.14),前者只是简单的替换,后者还要经过一系列的编译器的安全检查的, 这也是增加了安全性
我也试了试 #define 是否可以再class类里面使用, 结果是可以的, 但是#define是没有作用域的, 也没有什么public, private之分的, 就相当于一个全局的变量, 什么都可以使用
class
MyClass
{
public:
typedef long INDEX;
...
};
如果该语句放在public段中,则可以在类外部使用,比如:
MyClass::INDEX usercode;//声明一个变量
而如果放在private段中,则只能在类内使用。
以往我也经常用typedef,但是从来没有在类里面用过。今天算是学了一招了。C++引入“仅在类内部起作用的类型别名”的初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。比如同样表示长度,可能有的类中只须char即可,有的类中要用int,而有的类可能连long都嫌小。那么,我一概起个别名叫“size”,不同的类中有不同的定义。于是,下面的声明语句就足以避免冲突而且易于理解:
MyClass::size MyClass::GetSize() const;
进而,我试验了一下在函数体内部typedef,果然这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。
至此,我们可以回过来考虑一下,为什么C++有了“#define”还要“typedef”。过去我始终没有细想过这个原因。原来这样做是为了安全性与健壮性。
这里,我联想到了const,C语言中没有常量这个概念,如果要用常量,就用“#define pi 3.14”这种形式,但是C++有了“const double pi = 3.14;”虽说继续用前者一样可以写出程序,但这等于放弃了编译器的安全检查。
“#define”产生的效果在编译之前就起作用了,所有的pi都被替换成了3.14这样一个“立即数”,立即数是没有类型的,于是,在程序编写过程中不可能给予合适的提醒,在程序的编译中也可能产生意想不到的副作用。const将常量作为有类型的数据进行有效管理,既提供了常量的优点,也给予了足够的安全性。而且,const常量是有作用域的,在程序的不同位置可以给予不同精度的pi。
typedef long INDEX 给long这样的类型起别名,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度),
但是现在了解到可以在class类里面使用(并且还有public,private之分哦) C++引入“仅在类内部起作用的类型别名”的初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。在函数体内部typedef,这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。
c中有了#define 为什么还要typedef就是为了增强安全和健壮性
随便记录下c中的常量(#define pi = 3.14)和c++中的常量(const double pi = 3.14),前者只是简单的替换,后者还要经过一系列的编译器的安全检查的, 这也是增加了安全性
我也试了试 #define 是否可以再class类里面使用, 结果是可以的, 但是#define是没有作用域的, 也没有什么public, private之分的, 就相当于一个全局的变量, 什么都可以使用
class
MyClass
{
public:
typedef long INDEX;
...
};
如果该语句放在public段中,则可以在类外部使用,比如:
MyClass::INDEX usercode;//声明一个变量
而如果放在private段中,则只能在类内使用。
以往我也经常用typedef,但是从来没有在类里面用过。今天算是学了一招了。C++引入“仅在类内部起作用的类型别名”的初衷应该不难理解:通过限制该类型别名的作用域来防止冲突。比如同样表示长度,可能有的类中只须char即可,有的类中要用int,而有的类可能连long都嫌小。那么,我一概起个别名叫“size”,不同的类中有不同的定义。于是,下面的声明语句就足以避免冲突而且易于理解:
MyClass::size MyClass::GetSize() const;
进而,我试验了一下在函数体内部typedef,果然这个别名在函数体以外不可以使用,也就是说,“类型别名”和变量、函数一样具有作用域。
至此,我们可以回过来考虑一下,为什么C++有了“#define”还要“typedef”。过去我始终没有细想过这个原因。原来这样做是为了安全性与健壮性。
这里,我联想到了const,C语言中没有常量这个概念,如果要用常量,就用“#define pi 3.14”这种形式,但是C++有了“const double pi = 3.14;”虽说继续用前者一样可以写出程序,但这等于放弃了编译器的安全检查。
“#define”产生的效果在编译之前就起作用了,所有的pi都被替换成了3.14这样一个“立即数”,立即数是没有类型的,于是,在程序编写过程中不可能给予合适的提醒,在程序的编译中也可能产生意想不到的副作用。const将常量作为有类型的数据进行有效管理,既提供了常量的优点,也给予了足够的安全性。而且,const常量是有作用域的,在程序的不同位置可以给予不同精度的pi。
相关文章推荐
- hdu1598 有向边 并查集
- C++函数调用的完美灾难
- C++ 指针与引用 知识点 小结
- 在C#中调用C++写的DLL
- c++,为什么要引入虚拟继承
- C++之迭代器(iterator)与集合(vector)
- C++变量和基本类型笔记
- C语言-Switch 和case 的使用注意事项以及穿透效果的使用
- VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline
- 在VC++6.0中给对话框设置背景色或者背景图片
- 【C++笔记】第二章
- 在c++中可以调用java中的方法,从而实现java与c++的的交互。
- C++ 数据的保护(const)
- Bit Manipulation - Power of Two
- Java的内存泄漏_与C/C++对比(转载总结)
- Jungle Roads(1301)
- ios学习之旅---c语言函数
- c++函数指针与默认参数
- 如何判断机器的字节顺序是高字节在前还是低字节在前
- c++, class的大小