c++中别名的定义 using、#define、typedef、typename、namespace的使用

2023-11-14

typedef typename #define namespace using区别

1.关键字typedef定义别名

//例1:定义变量别名
typedef unsigned int  size_t; //size_t是unsigned int的别名
size_t i=2; //等价于 unsigned int i=2;
//例2:定义结构别名
typedef struct SA
{

}Sa,*Spa; //C结构写法,SA结构的一个指针对象别名Spa,和一个对象别名Sa
Sa s;
Spa* sp;

2.typename

  1. 用于模板声明
template<typename T>
class S{};
  1. 用于模板类嵌套从属命名时,强调这是一个类型
//例1:
template<typename C>
void f(const C& container, typename C::iterator iter);
//例2:
template<typename C>
class S
{
    typename C::iterator iter1;//声明一个 C::iterator 的成员 iter1
    using iter2=typename C::iterator; 定义别名 iter2 ,类型是C::iterator
};

3.文本替换宏define

#define PI 3.1415926 //用PI代替3.1415926
double db = PI; //db=3.1415926

4.using

  1. 用于命名空间
//例1:
using namespace std;//命名空间std内的成员可以直接使用
cout <<"Hello World!";//true
int i;
cin >> i;//true
//例2:
using namespace std::cout;//可以直接使用命名空间std内的cout成员
cout <<"Hello World!";//true
int i;
cin >> i;//error
std::cin >> i;//true
  1. 用于类成员
    1. 用于将基类成员引入到派生类的定义中,例如将基类的受保护成员暴露为派生类的公开成员
    2. 用于继承构造函数
struct B {
	B(){ std::cout << "B构造\n"; }
protected:
	void g(char) { std::cout << "B::g\n"; }
	int m; // B::m 为受保护
};

struct D : B {
	using B::m; // D::m 为公开
	using B::g; // D::g(char)变成公开
	void g(int) { std::cout << "D::g\n"; } // g(int) 与 g(char) 均作为 D 成员可见
	using B::B;//继承B的构造
};
int main(int argc, char* argv[])
{
	
	D d;// print: B构造 【d调用基类B的构造】
	d.m; //【类外可访问,m从基类的保护变公有】
	d.g(1); //print: D::g 
	d.g('c');//print: B::g
}

  1. 用于类型别名与别名模板声明
	template<typename T>
	using myVec=vector<T>;
	myVec<int> vec;

5.namespace 使用在命名空间上

语法:

  • namespace 别名 = 命名空间名; (1)
  • namespace 别名 = ::命名空间名; (2)
  • namespace 别名 = 嵌套名::命名空间名; (3)
namespace Q {
	namespace V { // V 是 Q 的成员,且完全在 Q 内定义
  // namespace Q::V { // C++17 中对上述二行的替代写法
		class C { void m(); }; // C 是 V 的成员且完全定义于 V 内
							   // C::m 仅声明
		void f(); // f 是 V 的成员,但只在此声明
	}
	void V::f() // V 的成员 f 的 V 外定义
				// f 的外围命名空间仍是全局命名空间、Q 与 Q::V
	{
		extern void h(); // 这声明 ::Q::V::h
	}
	void V::C::m() // V::C::m 的命名空间(及类)外定义
				   // 外围命名空间是全局命名空间、Q 与 Q::V
	{
	}
}

int main(int argc, char* argv[])
{
	namespace nm1 = ::Q::V;
	namespace nm2 = Q::V;
	namespace nm3 = Q;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中别名的定义 using、#define、typedef、typename、namespace的使用 的相关文章

随机推荐

  • CCNP-冗余链路中的广播风暴、多帧复制、地址表的不稳定

    STP协议 当网络中存在备份链路时 只允许主链路激活 如果主链路因故障而断开后 备用链路才会被打开 广播风暴 在没有避免交换环路措施的情况下 每个交换机都无穷无尽的转发广播帧 广播流量破坏了正常的通信流 消耗了带宽和交换机的CPU资源 直至
  • python一行输出多个空格_python 在同一行依次输入三个值a,b,c,用空格分开,输出 b*b-4*a*c的值...

    拒绝回答一系列代码细节 自行百度学习对应函数 import re import math print Input four numbers seperated by scape enter for ending input myinputs
  • 如何优化算法提高卷积神经网络的泛化能力

    卷积网络的优化方式 方法 说明 使用更多数据 在有条件的前提下 尽可能多地获取训练数据是最理想的方法 更多的数据可以让模型得到充分的学习 也更容易提高泛化能力 使用更大批次 在相同迭代次数和学习率的条件下 每批次采用更多的数据将有助于模型更
  • ZYNQ 7000的硬件SPI控制器配置为三线制SPI

    使用zynq去做一些AD DA的操作时候有些只支持三线制的SPI那么我们如何使用PS端的控制器EMIO到PL端实现3线制呢 以上是SPI0的接口信号 我们可以把PL侧的三线制的SDIO信号 inout 通过一个IOBUF原语进行转换出in
  • 数字电路的逻辑符号

  • Mybatis框架之解决列名(表中的字段名称)和实体类中的属性名不一致

    查询数据的时候 查不到userName的信息 原因 数据库的字段名是user name 而POJO中的属性名字是userName 两端不一致 造成mybatis无法填充对应的字段信息 修改方法 在sql语句中使用别名 解决方案1 在sql语
  • 深入理解CRITICAL_SECTION

    http www cnblogs com dirichlet archive 2011 03 16 1986251 html 摘要 临界区是一种防止多个线程同时执行一个特定代码节的机制 这一主题并没有引起太多关注 因而人们未能对其深刻理解
  • Hive其他优化

    一 关联优化器 在Hive的一些复杂关联查询中 可能同时还包含有group by等能够触发shuffle的操作 有些时候shuffle操作是可以共享的 通过关联优化器选项 可以尽量减少复杂查询中的shuffle 从而提升性能 set hiv
  • GPU显存问题-解决Failed to get convolution algorithm. This is probably because cuDNN failed to initialize

    GPU显存问题 使用服务器跑深度学习代码时出现了这样的问题 Failed to get convolution algorithm This is probably because cuDNN failed to initialize so
  • Docker私有仓库搭建与界面化管理

    一 关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方 我们可以在上面找到我们想要的镜像 也可以把我们自己的镜像推送上去 但是有时候我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像 这个可以通过
  • 动态定义数组

    首先 为什么需要动态定义数组呢 这是因为 很多情况下 在预编译过程阶段 数组的长度是不能预先知道的 必须在程序运行时动态的给出 但是问题是 c 要求定义数组时 必须明确给定数组的大小 要不然编译通不过 如 int Array 5 正确 in
  • android频响曲线图,EQ 频响曲线

    import android annotation SuppressLint import android content Context import android graphics Canvas import android grap
  • 利用matplotlib绘制折线图:CSV格式

    熬过初学阶段的不适和挫败感 我们其实完全可以掌握一个全新的领域 本文为 python编程 从入门到实践 以下简称参考书 中第16章 下载数据中的内容 利用matplotlib绘制最高及最低气温折线图 在此整理为笔记 一为温习 二为备份 以便
  • 深度优先搜索详解 C++实现

    DFS 全文大概四千字左右 如果您初学DFS相信会对您会有很大的帮助 能力有限 很多术语不够专业 理解万岁 二叉树的深度优先搜索 二叉树的概念这里就不细谈了 使用数组来存储二叉树 根结点从1开始 方便计算 设父节点的下标为n 那么左儿子的下
  • RabbitMQ的消息应答、重新入队、持久化

    思考 假如我们的消费者正在处理一个任务 这个任务处理的过程中 突然这个消费者宕机了 导致这个任务没有完成 然而RabbitMQ队列却把这个任务从队列中删除了 那么这个任务就丢失了 改如何解决 消息应答 为了保证消息在发送过程中不丢失 rab
  • 【疑难】以指针赋值,形成数组形式

    include
  • Python项目开发:Flask基于Python的天气数据可视化平台

    目录 步骤一 数据获取 步骤二 设置Flask应用程序 步骤三 处理用户输入和数据可视化 步骤四 渲染HTML模板 总结 在这个数字化时代 数据可视化已经成为我们理解和解释信息的重要手段 在这个项目中 我们将使用Python语言来开发一个基
  • Anaconda的下载步骤

    输入网站 https www anaconda com 进去之后 点击 get started 然后点击如下图所示的 Install Anaconda Individual Edition 然后点击 Download 选择Windows下面
  • AI图片生成Stable Diffusion环境搭建与运行

    Stable Diffusion是一种基于扩散过程的生成模型 由Ge et al 在2021年提出 该模型利用了随机变量的稳定分布 通过递归地应用扩散过程来生成高质量的图像 与其他生成模型相比 Stable Diffusion在生成高质量的
  • c++中别名的定义 using、#define、typedef、typename、namespace的使用

    typedef typename define namespace using区别 1 关键字typedef定义别名 2 typename 3 文本替换宏define 4 using 5 namespace 使用在命名空间上 1 关键字ty