引子:typedef 和 函数指针
- 函数指针
顾名思义,函数指针就是指向函数地址的变量。函数指针的使用往往会和指针函数混淆。在C++规则中,括号优先级是大于*优先级的,所以表达式**关键字(*函数名)**表达就是一个指针类型。下面拿int类型设计一个指针函数和一个函数指针加以区分。
int* func1(int val);//指针函数
int(*func2) (int val);//函数指针
-
typedef
typedef用于给变量起别名,增加代码的可读性。最基本的用法就如以下代码所示。
typedef int type_int; //type_int相当于int的别名
typedef int *type_int_p;//type_int_p相当于int*的别名
typedef struct { type_int x; } type_struct;//type_struct相当于该结构体的别名
typedef int type_array[] ;//type_array相当于整型数组的别名
int main() {
type_int a = 2;
type_int_p p = &a;
cout<<"a= " << a << endl;
cout << "p= " << p;
}
运行结果
a= 2
p= 0000006D208FF764
另外,定义新类型时添加括号并不是语法错误,如
type_array(arr) = { 2,3,4 };//定义了一个数组,数组内容为{2,3,4}
接下来看看这种形式
typedef int nickname(int,string);
它的作用相当于给返回类型为int,含一个int类型和一个string类型的参数的函数起了别名nickname。下面的一段程序将演示它的使用方式。
typedef int nickname(int,string);
typedef int (*_nickname)(int,string);
nickname(CallMeRealName);//相当于函数定义 int CallMeRealName(int id, string name);
int main() {
_nickname func1;
func1 = CallMeRealName;//func1相当于CallMeRealName函数
cout << "id 为" << func1(702, "詹姆斯");
}
int CallMeRealName(int id, string name) {
cout << "我叫" << name << " !" << endl;
return id;
}
为了可读性,更多的用typedef给函数指针起别名,这样在编程过程中能将原来的函数名修改成一个应景的名字,增加可读性。而对普通函数起别名多用于在函数定义的过程中。
using 的使用
using的基本使用方法跟typedef大同小异,就不详述了。区别是using习惯于用赋值的方式定义变量的新名称。
using type_int = int;
using nickname = int(*)(int, string);
using相比于typedef有什么优势呢?下面举一个用typedef给模板取别名的例子。
template<class T>
typedef vector<T>typedef_vector;//错误
类似语句编译器会提示” 此处不能指定typedef “,如果想用typedef指定模板,需要用一个类或者结构体将模板包含进去。像这样
template<class T>
struct MyVec {
typedef vector<T>typedef_vector;
};
但是用using的方式的话就会简单很多,不需要先建立结构体或者类,直接定义即可
template<class T>
using using_vector = vector<T>;
之后在看一看在初始化的区别, 先定义了一个仿函数Myprint,用于打印输出
template<class T>
class Myprint {
public:
void operator()(T val) {
cout << val << " ";
}
};
MyVec<string>::typedef_vector test1 = { "张三","李四","王五","赵六" };//typedef
using_vector <string>test2 = { "张三","李四","王五","赵六" };//using
cout << "typedef:" << endl;
for_each(test1.begin(), test1.end(),Myprint<string>());
cout << endl<<"using:" << endl;
for_each(test2.begin(), test2.end(), Myprint<string>());
运行结果
typedef:
张三 李四 王五 赵六
using:
张三 李四 王五 赵六
可以明显看出,用typedef给模板起别名的时候,明显地冗杂。而用using不仅相对轻巧,代码的可读性也大大的提高。