一、类型别名
- 类型别名是一个现有类型的另一个名称。它可以让代码更加清晰易读,特别是在处理复杂类型时。在 C++ 中,可以使用
typedef
关键字或using
关键字来定义类型别名。
1. 使用typedef
定义类型别名
typedef 类型 别名
typedef int MyInt;
MyInt a = 10;
MyInt
是int
的类型别名。现在可以使用MyInt
来声明变量,就像使用int
一样。
2. 使用using
定义类型别名
using 别名 = 类型
using MyInt = int;
MyInt b = 20;
- 类型别名的作用不仅仅局限于基本数据类型。它还可以用于复杂类型,如指针、引用、数组和函数指针等。
typedef int* IntPtr;
using MyFunc = void (*)(int);
IntPtr
是int
指针的类型别名,MyFunc
是一个指向函数的指针类型别名,该函数接受一个int
参数无返回值。
二、using声明
using
声明是用于将一个命名空间中的特定名称引入到当前作用域中,使得在当前作用域中可以直接使用该名称进行访问,而无需加上命名空间限定符。
1.基本用法
namespace myNamespace {
void func() {
std::cout << "Function in namespace." << std::endl;
}
}
- 可以使用
using
声明将 myNamespace::func
引入到当前作用域:
using myNamespace::func;
int main() {
func();
return 0;
}
- 在
main
函数中,就可以直接调用 func
,而无需加上命名空间限定符 myNamespace::func
。
2.引入命名空间中的特定类型
namespace myNamespace {
class MyClass {
public:
void print() {
std::cout << "MyClass in namespace." << std::endl;
}
};
}
using myNamespace::MyClass;
int main() {
MyClass obj;
obj.print();
return 0;
}
- 这里通过
using
声明引入了 myNamespace
中的 MyClass
,可以在当前作用域中直接使用该类型。
3.与模板结合使用
namespace myNamespace {
template<typename T>
void templateFunc(T value) {
std::cout << "Template function in namespace: " << value << std::endl;
}
}
using myNamespace::templateFunc;
int main() {
templateFunc(10);
templateFunc("Hello");
return 0;
}
- 这里通过
using
声明引入了命名空间 myNamespace
中的模板函数 templateFunc
,可以在当前作用域中直接调用该模板函数。
注意:
- 谨慎使用
using
声明,尤其是在引入多个命名空间中的同名实体时,可能会导致命名冲突。 - 如果引入的名称与当前作用域中已有的名称冲突,会导致编译错误。在这种情况下,可以考虑使用别名或更明确的命名来避免冲突。
namespace ns1 {
void func() {
std::cout << "Function from ns1." << std::endl;
}
}
namespace ns2 {
void func() {
std::cout << "Function from ns2." << std::endl;
}
}
int main() {
using func1 = ns1::func;
using func2 = ns2::func;
func1(); // 调用 ns1 中的 func
func2(); // 调用 ns2 中的 func
return 0;
}
- 在这个例子中,使用类型别名将两个命名空间中的
func
分别命名为 func1
和 func2
,从而避免了命名冲突。