c++11中using的使用

本文详细介绍了C++中using声明的三种常见用法:命名空间使用、类型别名定义及子类访问基类成员。通过具体示例,深入解析using在防止命名冲突、提高代码可读性及模板别名指定等方面的应用,以及如何在私有继承中通过using声明使子类能够访问基类的私有和保护成员。
部署运行你感兴趣的模型镜像

用法一:命名空间

这种用法估计使用最多的,为了防止定义变量名、函数名冲突,把它们定义在一个命名空间内,使用的时候需要进行命名空间的申明:using namespace std;就不过多讲解。



用法二:alias的使用

using 还可以指定别名,比如using SO3d = SO3<double>; 那么它和typedef ,有什么区别?

  • 可读性
    我们使用typedef定义函数指针:typedef void (* FUN_) (int, int); 函数指针指向的函数返回值是void,输入参数是int, int型。
    我们使用using 定义函数指针:using FUN_ = void(*)(int, int);
    using的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰

  • 指定模板的别名,而typedef不行
    假如我们定义一个类模板:
template<class _scale, int option>
class Person
{
public:
    _scale age;
    _scale name[option];
};

template<class _T>
using myperson = Person<_T, 6>;  // Ok

//typedef Person<_T, 6> myperson; // fail

myperson<int> p;


用法三:子类引用基类成员

  • 假如子类私有继承父类,子类无法使用父类的成员(变量,函数等),但是使用using可以访问,code如下:
template<class _scale, int option>
class Person
{
public:
    _scale age;
    _scale height;
    _scale name[option];

	void myprint(void)
	{
		cout << "age" << age << endl;
	}
};


template<class _scale, int option>
class HeighPerson : private Person<_scale, option>
{
public:
    using Person<_scale, option>::age; // 使用using 之后变成public
    using Person<_scale, option>::myprint; // 使用using, myprint之后变成public
    
protected:
	using Person<_scale, option>::height;  //在本来不可访问的,使用using 之后变成protected
    void test(void)
    {
	cout << "age" << age << endl;
    }
};

class Base
{
 public:
    void menfcn()
    {
        cout << "Base function" << endl;
    }

    void menfcn(int n)
    {
        cout <<  "Base function with int" << endl;
    }

};

class Derived : private Base
{
 public:
    using Base::menfcn;  //using声明只能指定一个名字,不能带形参表
    void menfcn(int a, int b)
    {
	cout << "derived function" << endl;
    }
};
int main()
{
    Base b;
    Derived d;
    b.menfcn();
    d.menfcn(2);  
    d.menfcn(2,3)

}

  • 申明继承父类构造函数
class Base
{

 public:
     Base(int a)
     {
	 cout << "base constructor"<< a << endl;
     }
};

class Derived : private Base
{
 public:
     using Base::Base;
};

int main()
{
    Base b(1);
    Derived d(2);

}


在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>好的,我现在需要回答用户关于C++11using关键字的用法和示例的问题。首先,我得回忆一下自己之前学过的关于C++的知识,特别是C++11的新特性。记得在C++11中,using关键字有了更多的用途,除了传统的命名空间和类型别名之外,可能还有其他功能。用户提供的引用资料里提到了using取代了typedef,以及命名空间管理,所以需要结合这些信息来组织答案。 首先,我需要确定usingC++11中的主要用途。根据引用[1],using用于命名空间管理和类型定义,并且取代了typedef。引用[3]也提到usingC++11中的扩展功能。所以,我需要分点说明这些用途,并给出相应的示例。 第一个用途是类型别名,也就是替代typedef。这时候需要对比typedef和using的语法差异,例如typedef旧的类型别名方式,而using更直观。比如typedef std::vector<int> IntVec; 对应的using写法应该是using IntVec = std::vector<int>;。这可能更清晰,尤其是在模板别名的情况下,using的优势更明显,因为typedef无法直接处理模板别名。 第二个用途是命名空间管理,包括引入整个命名空间或者特定成员。例如using namespace std; 或者using std::cout;。这部分用户提供的引用[2]和[4]里有示例代码,可以引用这些例子。 第三个用途可能是继承构造函数,这在C++11中允许派生类使用using声明来继承基类的构造函数。比如在派生类中写using Base::Base;,这样派生类就可以使用基类的构造函数。这个点需要确认是否正确,可能用户提供的引用里没有提到,但根据我的知识,这是C++11的新特性之一。 接下来,我需要为每个用途编写示例代码,确保符合用户的要求。例如,在类型别名部分,给出模板别名的例子,展示using如何用于模板,而typedef无法做到这点。例如: template<typename T> using MyVector = std::vector<T, MyAllocator<T>>; 这样,MyVector<int>就等价于std::vector<int, MyAllocator<int>>,而用typedef的话无法直接实现。 另外,关于继承构造函数的例子,可以构造一个基类和派生类,然后在派生类中使用using继承基类的构造函数: class Base { public: Base(int x) {} }; class Derived : public Base { public: using Base::Base; // 继承Base的构造函数 }; 这样,Derived就可以用Derived d(5);来构造。 然后,需要注意用户提供的引用中的内容,例如引用[1]提到using取代了typedef,引用[2]和[4]展示了命名空间的使用。需要正确引用这些内容,比如在类型别名部分引用[1],在命名空间部分引用[2]和[4]。 在组织回答时,需要结构清晰,分点说明,每个用途作为一个小标题,下面给出说明和示例代码。同时,按照用户的系统级指令,行内数学表达式用$...$,但这里可能用不到数学公式,但代码需要用代码块包裹,并正确使用中文回答。 最后,生成相关问题,需要考虑用户可能感兴趣的扩展问题,比如using与typedef的区别、在模板中的应用、继承构造函数的注意事项、命名空间管理的最佳实践等。 在检查过程中,需要确保示例代码的正确性,比如using namespace std;的正确使用,避免潜在的名字冲突问题,并提到推荐的做法是引入特定成员而非整个命名空间。同时,确认引用标记的正确位置,比如在提到取代typedef时引用[1],在命名空间示例时引用[2][4],在总结时引用[3]。 可能存在的疑问点包括:是否还有其他C++11using的用法?比如在模板元编程中的其他应用,但根据引用资料和常见用法,主要应覆盖类型别名、命名空间管理、继承构造函数这三个方面。此外,需要确认using在模板别名中的语法是否正确,是否有其他限制。 总结下来,回答的结构应该是: 1. 类型别名(替代typedef) - 示例:基本类型别名,模板别名 2. 命名空间管理 - 引入整个命名空间 - 引入特定成员 3. 继承构造函数 - 示例代码 4. 注意事项 5. 相关问题 确保每个部分都有对应的引用标注,示例代码正确,并且语言简洁明了。</think>### C++11中`using`关键字的使用方法与示例 `using`在C++11中扩展了功能,主要用于**类型别名定义**、**命名空间管理**和**继承构造函数**。以下是具体说明与示例: --- #### 一、类型别名(替代`typedef`) C++11允许使用`using`定义类型别名,语法更直观,尤其在模板编程中更灵活[^1]。 1. **基本类型别名** ```cpp using IntVector = std::vector<int>; // 替代 typedef std::vector<int> IntVector; ``` 2. **模板别名** `using`支持模板参数,而`typedef`无法直接实现: ```cpp template <typename T> using CustomVector = std::vector<T, MyAllocator<T>>; // 自定义分配器的模板别名 ``` --- #### 二、命名空间管理 `using`用于简化命名空间中标识符的访问[^2][^4]。 1. **引入整个命名空间** ```cpp #include <iostream> using namespace std; // 引入std命名空间 int main() { cout << "Hello, World!" << endl; // 无需前缀 return 0; } ``` 2. **引入特定成员**(推荐方式) 避免全局命名空间污染: ```cpp using std::cout; using std::endl; int main() { cout << "Hello!" << endl; return 0; } ``` --- #### 三、继承构造函数(C++11新增) 派生类可通过`using`直接继承基类构造函数: ```cpp class Base { public: Base(int x) { /* ... */ } }; class Derived : public Base { public: using Base::Base; // 继承Base的构造函数 }; // 使用示例 Derived d(10); // 调用继承的Base(int x) ``` --- #### 注意事项 1. **命名空间污染**:避免过度使用`using namespace`,尤其在头文件中[^4]。 2. **模板别名优势**:`using`在泛型编程中支持更复杂的类型组合[^1]。 3. **可读性提升**:相比`typedef`,`using`的语法更接近变量赋值,逻辑更清晰[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值