c++中的点号(.),冒号(:)和双冒号(::)运算符

2023-05-16

1.冒号(:)用法

(1)表示机构内位域的定义(即该变量占几个bit空间)

typedef struct _XXX{

             unsigned char a:4;  //char型的字符a占4位

             unsigned char c;

} XXX;

(2)构造函数后面的冒号起分割作用,是 类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
struct _XXX{

         _XXX() : y(0xc0) {  }

};
(3) public:和private:后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个"public:”或"private:”出现为止。"private:"为默认处理。

(4) 类名冒号后面的是用来定义类的继承

 class 派生类名 : 继承方式  基类名
{
        派生类的成员
};
继承方式:public、private和protected,默认处理是public。

2.双冒号(::)用法

(1)表示“域操作符”
        例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数
(2)直接用在全局函数前,表示是全局函数
        例:在VC里,你可以在调用API 函数里,在API函数名前加 ::
(3)表示引用成员函数及变量,作用域成员运算符
        例:System::Math::Sqrt() 相当于System.Math.Sqrt()
——————————————————————————————————————

VC中如下
      ::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。
  :: 一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,考试,大提示在类内定义的时候,打此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。

*********************************************************************************************

这篇文章将总结C/C++中的冒号的用法。


1、位域定义
这个在前面关于位结构体的文章里说得够多的了,不再重复了。

2、类构造函数(Constructor)的初始化列表
先说下什么叫构造函数吧(是不是啰嗦了?C++的人应该都知道了吧,还是以防万一一下)。所谓构造函数,就是与类同名的函数,它与普通函数的区别在于,它没有返回类型。
在构造函数后面紧跟着冒号加初始化列表,各初始化变量之间以逗号(,)隔开。下面举个例子。

class myClass
{
    public :
               myClass();// 构造函数,无返回类型,可以有参数列表,这里省去
               ~myClass();// 析构函数
               int a;
               const int b;
}

myClass::myClass():a(1),b(1)// 初始化列表
{
}
上面的例子展示了冒号的这个用法,下面对这个用法进行几点说明:
1) 初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的
在初始化列表中是对变量进行初始化,而在构造函数内是进行赋值操作。两都的差别在对于像const类型数据的操作上表现得尤为明显。我们知道, const类型的变量必须在定义时进行初始化,而不能对const型的变量进行赋值,因此const类型的成员变量只能(而且必须)在初始化列表中进行初始化,即下面的代码将会出错:
myClass::myClass()
{
     a = 1;// 没错,效果相当于在初始化列表中进行初始化
     b = 1;// 出错,const变量不能进行赋值操作;
}
2)初始化的顺序与成员变量声名的顺序相同。
     先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要的哦,一般在 初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误
3)对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化。

3、声明基类。
假设我们重新定义一个类,继承自myClass类。定义方式如下:
class derivedClass : public myClass
{
       // 略去
}
这里的冒号起到的就是声名基类的作用,在基类类名前面可以加public/private/protected等标签,用于标识继承的类型,也可以省略,省略的话,用class定义的类默认为private,用struct定义的类默认为public,至于具体各个标签有什么区别这里就不说了。
与初始化列表一样的,这里也可以声名多个基类,各基类之间用逗号(,)隔开。

4、条件语句(? :)
与?构成条件语句,作用相当于if else,如下;
int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,则反a赋给c,否则把b赋给c
条件语句的结构为:
条件表达式?表达式1:表达式2
当条件表达式为true时,表达式的值为表达式1的值,否则为表达式2的值。
几点说明:
1)?:可以嵌套,但不推荐使用(难懂),下面的表达式你能看懂啥意思不?
int max = i>j ? i>k ? i : k : j>k ? j : k;
脑袋大了吧,呵呵。
2)?:具有很低的优先级,这个要注意哦,下面的程序执行结果是啥呢?
int i = 3;
int j = 2;
cout << i>j?i:j; // 出错<<比>具有更高的优先级,执行顺序为 ((cout<<i)>j)?i:j,相当于是比较cout<<i与j的大小,然后根据比较结果决定表达式值为i或j,这显然要出错的,cout<<i的值是cout,不能跟整型数j进行比较
cout << (i>j)?i:j; //输出1或0,相当于(cout<<(i>j))作为判决条件,来决定表达式的值为i或j,而cout<<(i>j),i>j则输出1否则0,然后再将(cout<<(i>j))作为?:的条件,如果cout正确执行则为1(true),否则为0(false),以此决定表达式值为i或j
cout <<(i>j?i:j);//i>j则输出i,否则输出j,表达式值为true如果cout正确执行,否则为false
更多的关于优先级的问题就不说了。

5、语句标签
通常跟goto配合使用,如:
step1: a = f1();
....
goto step1;
这种作法也不是很推荐,原因在于它破坏了语句的顺序执行,这样的代价大家应该清楚吧。不过存在即为合理嘛,既然它还存在,肯定还是有它的用处有它的好处的,比如说,多层嵌套的退出(会比break continue直观一点吧),也可以避免重复代码之类之类的

6、switch语句中case后。
这个不说了,要是不会的话,我也没话可说了。

7、汇编指令模板
这个我也不懂,不班门弄斧了,可以参考一下:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html
改天学习一下。

*********************************************************************************************

1、 
作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
如:A,B表示两个类,在A,B中都有成员member。那么
A::member就表示类A中的成员member

B::member就表示类B中的成员member


2、 

全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如:

char zhou; //全局变量

void sleep()

{

    char zhou; //局部变量

    char(局部变量) = char(局部变量) *char(局部变量) ;

    ::char(全局变量) =::char(全局变量) *char(局部变量);

}
3、 

::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如

	class CA {  
	public:  
	  int ca_var;  
	  int add(int a, int b);  
	  int add(int a);  
	}; 
	  
	//那么在实现这个函数时,必须这样书写:  
	int CA::add(int a, int b)  
	{  
	  return a + b;  
	}  
	  
	//另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:  
	int CA::add(int a)  
	{  
	  return a + ::ca_var;  
	} 
	  
	//表示当前类实例中的变量ca_var。
  

C++中点号(.)运算符

首先介绍一下C++中的结构。对于一个结构来说,
struct MyStruct {
         int member_a;
};

如果有个变量MyStruct s,那么使用其中的成员元素时可以用
s.member_a = 1;

如果采用指针方法访问,比如MyStruct * ps,那么同样的访问必须用箭头号:

ps->member_a = 1;

::只用在类成员函数和类成员变量中。比如,声明一个类:

class CA {
          public:
          int ca_var;
          int add(int a, int b);
          int add(int a);
};

那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
     return a + b;
}

另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:

int CA::add(int a)
{
     return a + ::ca_var;
}

表示当前类实例中的变量ca_var。

c++中当定义类对象是指针对象时候,就需要用到->指向类中的成员;当定义一般对象时候时就需要用到"."指向类中的成员.......
例如:

class A
{
    public: 
          play();
}

如果定义如下:

A *p则:p->play()使用; 左边是结构指针。
A p 则:p.paly()使用; 左边是结构变量。


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

c++中的点号(.),冒号(:)和双冒号(::)运算符 的相关文章

  • php写守护进程(Daemon)

    守护进程 xff08 Daemon xff09 是运行在后台的一种特殊进程 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件 守护进程是一种很有用的进程 php也可以实现守护进程的功能 1 基本概念 进程 每个进程都有一个父
  • clang-format 说明

    转载自 xff1a https www cnblogs com lepeCoder p 8032178 html BasedOnStyle string 这个样式用于所有没有特殊指定配置的选项 这个选项仅在clang format配置中支持
  • 路径规划

    转载 xff1a 链接 xff1a https www jianshu com p f3bab4e119cf D算法 xff0c Dijkstra算法 两个表 xff1a closed表与open表 closed表用于记录已访问过的节点 x
  • awk 筛选并计算时间

    grep 39 filter cost time 39 log file awk F 39 filtered route count 39 39 print 2 39 awk F 39 39 39 print 1 39 awk 39 BEG
  • 忽略批处理中的pause命令

    当存在一个批处理文件 run bat xff0c 其中 xff1a 64 echo 开始暂停 pause 64 echo 暂停结束 当我们执行这个run bat文件时 xff0c 运行到pause会提示需要按任意键继续 xff0c 并且命令
  • BullseyeCoverage 代码覆盖度检查工具

    昨日又有同事问我 BullseyeCoverage 的使用方法 xff0c 由于时间久远 xff0c 有些遗忘 xff0c 只后悔当初为什么没有整理记录下来 xff0c 只好重新查阅了很多文档 今日整理下比较重要的知识 xff0c 方便以后
  • 用于词义消岐的Lesk算法

    该算法由Michael E Lesk于1986年提出 xff0c 是一个基于词典的词义消岐方法 该算法认为 xff1a 一个词在词典中的词义解释与该词所在句子具有相似性 这种相似性可以由相同单词的个数来表示 xff0c 比如 cone 和
  • 通过cmake打印CMakeLists.txt中的宏

    转 cmake中宏的使用 原文路径 https blog csdn net qq 29573053 article details 80392441 首先贴一个例子进行分析 set var 34 ABC 34 macro Moo arg m
  • undefined reference to `vtable for XXXXX`

    vtable 表示的是虚表 这个错误出现时 请检查你的父类所有虚函数是否实现 或者子类是否把父类的虚函数都处理完 注意 析构函数也算
  • CMakeLists.txt ----find_package

    在linux平台下编译程序的时候通常都会使用到CMakeLists txt来制定编译规则 在查找需要链接的lib时候 通常会使用到find package 记录一下我之前用到的地方 find package 之后 最好到FindXXX cm
  • opencv学习笔记1 opencv安装及配置 一劳永逸不需要每次都重新配置

    opencv2 4 9地址 xff1a https sourceforge net projects opencvlibrary files opencv win 2 4 9 opencv 2 4 9 exe download vs2013
  • 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法

    一 问题描述 ubuntu开机只有桌面 xff0c 没有菜单栏和任务栏 xff0c 如下图 xff1a 二 问题解决 刚学习ubuntu xff0c 总有些像我这样不折腾就不舒服的人 xff0c 今天改了一下主题 xff0c 图标什么的 x
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想

    深入浅出递归和迭代的通用转换思想 一般来说 xff0c 能用迭代的地方就不要用递归 xff01 理论上讲 xff0c 所有的递归和迭代之间都能相互转换 xff01 刷题碰到 一天一道LeetCode 130 Surrounded Regio
  • 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介 xff0c 这些在 TCP IP详解 和 计算机网络 等书中有很多细致的讲解 xff0c 可以参考本人的这篇博客 计算机网络 第五版 阅读笔记之五 xff1a 运输层 xff0c 这篇博客就不再赘述
  • 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前 xff0c 我们先来总结一下vector和list的优缺点 vector在内存中是分配一段连续的内存空间进行存储 xff0c 其迭代器采用原生指针即可 xff0c 因此其支持随机访问和存储 xff0c 支
  • 带你深入理解STL之Set和Map

    在上一篇博客 带你深入理解STL之RBTree中 xff0c 讲到了STL中关于红黑树的实现 xff0c 理解起来比较复杂 xff0c 正所谓前人种树 xff0c 后人乘凉 xff0c RBTree把树都种好了 xff0c 接下来就该set
  • 一个小时开发的直播推拉流软件来了

    一 简介 目前市面上直播推流的软件有很多 xff0c 拉流也很常见 近期因为业务需要 xff0c 需要搭建一整套服务端推流 xff0c 客户端拉流的程序 随即进行了展开研究 xff0c 花了一个小时做了个基于winfrom桌面版的推拉流软件
  • Redis源码剖析--字符串t_string

    前面一直在分析Redis的底层数据结构 xff0c Redis利用这些底层结构设计了它面向用户可见的五种数据结构 xff0c 字符串 哈希 xff0c 链表 xff0c 集合和有序集合 xff0c 然后用redisObject对这五种结构进
  • Redis源码剖析--快速列表quicklist

    在RedisObject这一篇博客中 xff0c 有介绍到list结构的底层编码类型有OBJ ENCODING QUICKLIST xff0c 当时就发现这个底层数据结构被我遗漏了 昨天花了点时间补了补这个知识 xff0c 看完发现这货就跟
  • Redis源码剖析--列表list

    上一篇博客Redis源码剖析 快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理 Redis对外开放的列表list结构就是采用quicklist作为底层实现 xff08 在新版本的Redis源码中 xff0c 不再采用z

随机推荐

  • PX4二次开发(一:PX4架构)

    概念 本节包含有关PX4系统架构和其他核心概念的主题 目录 PX4架构 PX4飞行栈架构 事件接口 飞行模式 飞行任务 控制分配 xff08 混控Mixing xff09 PWM限制状态机 系统启动 PX4 SD卡布局 PX4系统架构 以下
  • ssh登录警告 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    1 ssh远程登录警告提示信息如下 xff1a span class token function ssh span th 64 192 168 162 136 64 64 64 64 64 64 64 64 64 64 64 64 64
  • 在Mac上使用Dronekit与SITL做飞行程序的模拟调试

    背景 无人机的项目快要中期答辩了 xff0c 为了在地面站 xff08 电脑 xff09 控制无人机 xff0c 我们选择DroneKit来进行代码的书写 DroneKit是一个专门用于控制无人机的Python库 xff0c 使用这个API
  • 敏捷教练的十种能力

    1 具备神奇的 读懂一个房间 的能力 只要走进一个房间 xff0c 就能判断出不在的过程中 xff0c 房间里发生了什么事情 xff0c 能立即读出空气中蕴含的情绪 xff0c 从而判断是否一切正常 xff1b 2 关心人本身胜过关心产品
  • kubernetes: HPA解析

    什么是HPA Horizontal Pod Autoscaling可以根据指标自动伸缩一个Replication Controller Deployment 或者Replica Set中的Pod数量 HPA的工作模型 有哪些指标 目前主要分
  • ROS中生成CameraInfo消息

    前言 由于某个第三方代码需要接受CameraInfo消息 xff0c 我换了一个相机以后 xff0c 需要自己发布CameraInfo消息 网上搜了半天 xff0c 很少有介绍CameraInfo这些数据都是怎么来的的资料 xff0c 可能
  • OpenCV+aruco 生成标定格与相机位姿计算

    仅用于记录自己使用aruco过程中遇到的问题与解决方法 0 参考资料 github一个参考 xff1a https github com opencv opencv contrib blob master modules aruco sam
  • 计算机和控制领域SCI收录期刊及其影响因子

    来源 xff1a http hi baidu com daren007 blog item 0605ed97b1c50e6a55fb9608 html 031 Computer Applications amp Cybernetics No
  • 【学习总结】Kalibr标定相机与IMU

    本文仅用于记录自己学习过程 使用方法 Kalibr包括 xff1a 相机内参 xff0c 多相机外参 xff0c 已知IMU和相机内参的 相机与IMU标定 xff0c 以及扩展Kalibr支持IMU内参标定 当已知IMU内参和相机内参后 x
  • 【学习记录】Kalibr标定相机与IMU的一点记录

    一周更多的时间在搞这个Kalibr的相机与IMU的标定 xff0c 记录一些问题 xff1a 相机重投影误差 相机一定要好好标定 xff0c 如果重投影误差太大 xff0c 是优化不出来外参的 好在相机内参 xff0c 与IMU外参标定 x
  • 【学习总结】VIO初始化学习1:Monocular Visual–Inertial State Estimation With Online Initialization and Camera–IMU

    最近看了一篇论文 xff0c 很是头大 xff0c 大概看懂了个所以然 记录一下 论文 xff1a Monocular Visual Inertial State Estimation With Online Initialization
  • PYTHON用法第一篇:print的用法。

    hello大家好 xff0c 我是会编程的杜子腾 xff0c 今天我们来学习一下python实例 xff1a print用法 使用材料 xff1a 一台电脑 python各版本 随便一个 xff0c 尽量选python3 python文本编
  • 那些女程序员们的故事

    点击上方蓝字 关注我们 xff0c 和小伙伴一起聊技术 xff01 程序媛是程序员大军中一道美丽的风景线 xff0c 今天的这篇文章就选取了一些女程序员们的故事 xff0c 希望当所有人了解了他们的经历后 xff0c 能让这个 重男轻女 的
  • shell中脚本变量和函数变量的作用域

    原文地址 xff1a http blog csdn net ltx19860420 article details 5570902 1 shell脚本中定义的变量是global的 xff0c 其作用域从被定义的地方开始 xff0c 到she
  • 最简单易懂的10堂算法入门课——算法是什么

    算法太重要了 人工智能 xff0c 机器学习 xff0c 大数据 xff0c 这些越来越常听到的字眼 xff0c 背后其实都是一个个 算法 诸多高新科技 xff0c 似乎都离不开 算法 的 加持 科学家 工程师 技术人员 xff0c 现在如
  • Opencv之Aruco码的检测和姿态估计

    1 介绍 Aruco码是由宽黑色边框和确定其标识符 id 的内部二进制矩阵组成的正方形标记 它的黑色边框有助于其在图像中的快速检测 xff0c 内部二进制编码用于识别标记和提供错误检测和纠正 单个aruco 标记就可以提供足够的对应关系 x
  • linux与window文件通过串口传输方法(zmod传输方法)

    我们在调试linux产品时 xff0c 有的产品没有网口 xff0c 只有串口 这时nfs tfp都用不了 只能用串口来传输文件 把windows上文件通过串口传输到开发板上 开发板和电脑通过串口连接 2 使用MobaXterm工具 xff
  • CentOS 7 需要安装的常用工具,及centos安装fcitx 搜狗输入法的坑旅

    Centos常用设置 1 当最大化时隐藏标题栏 或者使用tweak tool 在字体中将标题栏字体设置为0 建议这个方法 2 添加epel源 yum y nogpgcheck install http download fedoraproj
  • 小学数学公式大全

    小学数学公式大全 第一部分 xff1a 概念 1 加法交换律 xff1a 两数相加交换加数的位置 xff0c 和不变 2 加法结合律 xff1a 三个数相加 xff0c 先把前两个数相加 xff0c 或先把后两个数相加 xff0c 再同第三
  • c++中的点号(.),冒号(:)和双冒号(::)运算符

    1 冒号 xff08 xff09 用法 xff08 1 xff09 表示机构内位域的定义 xff08 即该变量占几个bit空间 xff09 typedef struct XXX unsigned char a 4 char型的字符a占4位