using与typedef的区别

引子: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不仅相对轻巧,代码的可读性也大大的提高。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值