C++ 中的类型别名和 using 声明
类型别名是为已有的类型定义一个新名称,可以使用typedef或using关键字来定义
using声明可以引入一个命名空间中的特定名称到当前作用域,或者为模板类型定义一个别名
使用typedef的语法是:
typedef 已存在的类型 新类型的名字
//下面定义了一个新的类型别名MyInt,它实际上和int类型是完全一样的,之后就可以使用MyInt来声明变量
typedef int MyInt;
MyInt num = 5;//和int num = 5是等价的
使用using 关键字定义类型别名的语法是:
using 新类型的名字=已存在的类型
using MyFloat = float;
//之后就可以用MyFloat来定义浮点型变量
MyFloat pi = 3.14f;。
使用using 声明引入命名空间中的名称的语法是:
using namespace::name;
using namespace std会将std命名空间中的所有名称(如vector、string、map等各种类型和函数)引入到当前的代码作用域。但这种方式存在潜在的风险,因为它可能会导致名称冲突。假设你的代码中已经定义了一个名为vector的类型,同时又使用using namespace std;引入了std命名空间中的std::vector类型。当你在代码中写vector时,编译器可能会混淆你到底是想使用自己定义的vector还是std中的std::vector,从而导致编译错误或者运行时的逻辑错误。所以,在实际编程中尽量避免使用这种方式引入整个命名空间,除非你能确保不会产生名称冲突。
为模板类型定义一个别名
下面是定义一个模板类型别名来表示std::vector的某种特定类型(这里以int为例),这样就可以方便地使用MyVector来创建不同类型的vector
template<typename T>
using MyVector = std::vector<T>;
MyVector<int> intVec;
MyVector<double> doubleVec;
继承和派生类中的类型别名使用
在继承关系中,基类和派生类可以共享类型别名。例如:在派生类Derived中,可以直接使用从基类Base继承来的类型别名MyType
class Base {
public:
using MyType = int;
};
class Derived : public Base {
public:
void func() {
MyType num = 10;
}
};
函数指针类型别名使用
//定义一个函数指针类型别名来表示一个返回int,接受两个int参数的函数指针
typedef int (*MathOp1)(int, int);
using MathOp2 = int (*)(int, int);
//可以使用这个别名来声明函数指针变量,并且可以将符合该函数指针类型的函数地址赋值给它
int add(int a, int b) {
return a + b;
}
int main() {
MathOp1 op1 = add;
MathOp2 op2 = add;
int result1= op1(3, 4);
int result2 = op2(5, 6);
cout << "result1:" << result1 << endl;//7
cout << "result2:" << result2 << endl;//11
return 0;
}
类型别名和using声明的优缺点:
优点:可以提高代码的可读性和可维护性,减少代码的重复(特别是当涉及到复杂的类型或者需要在代码中多次使用相同的类型定义时)
缺点:可能会导致命名冲突,如果不小心使用了相同的别名或引入了不适当的名称
原文地址:https://blog.csdn.net/ll923116/article/details/144035973
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!