C++中冒号的用法

1.冒号(:)用法

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

typedef struct _XXX{unsigned 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的成员函数。例如

[cpp] view plaincopy
01  class CA {    
02  public:    
03    int ca_var;    
04    int add(int a, int b);    
05    int add(int a);    
06  };   
07      
08  //那么在实现这个函数时,必须这样书写:    
09  int CA::add(int a, int b)    
10  {    
11    return a + b;    
12  }    
13      
14  //另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:    
15  int CA::add(int a)    
16  {    
17    return a + ::ca_var;    
18  }   
19      
20  //表示当前类实例中的变量ca_var。  
更多 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JaveScript运算符(JS知识点归纳三)

JaveScript中有许多的运算符,在这里就只说明一些需要注意的. 01 一元运算符 一元:指的是参与运算的操作数只有一个 最经常使用的是 -- 计算规则: /-- 前置于操作数的时候 , 先进行 aa1,再去进行运算 /--后置于操作数的时候 , 先进行运算,在进行aa1 无论/--前置于操作数还是后…

微软白皮书:47页报告详解中国芯片设计云技术

来源&#xff1a;智东西在多方面因素的推动下&#xff0c;中国的芯片设计行业迎来了前所未有的发展契机。当前&#xff0c;我国芯片设计业的产品范围已经涵盖了几乎所有门类&#xff0c;且部分产品已拥有了一定的市场规模&#xff0c;但我国芯片产品总体上仍然处于中低端&#…

Restful Service 中 DateTime 在 url 中传递

在C# url 中一旦包特殊字符&#xff0c;请求可能就无法送达。可以使用如下方法&#xff0c;最为便捷。 请求端&#xff1a; beginTime.Value.ToString("yyyyMMddHHmmss") 接收端&#xff1a; DateTime? dtBeginTime null; DateTime tempTime;if (DateTime.TryParse…

【无标题】this指针

在 C 中&#xff0c;每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此&#xff0c;在成员函数内部&#xff0c;它可以用来指向调用对象。 友元函数没有 this 指针&#xff0c;因为友元不是类的成员。只有成员函数才有 this 指针。 下…

一文读懂马斯克展示脑机接口:硬币大小芯片植入猪脑 实时读取猪脑信息

视频&#xff1a;马斯克展示脑机接口设备无线实时读取猪脑信息&#xff0c;时长约7分10秒来源&#xff1a;腾讯科技马斯克展示了一群实验猪。这些实验猪之前曾接受过外科手术&#xff0c;由手术机器人将最新版的Neuralink设备植入大脑。这些项目的目标都是利用大脑植入技术实现…

循环,函数,指针作业

一、循环 题目1&#xff1a;7-6 统计素数并求和 提交列表&#xff1a; 流程图&#xff1a; 问题&#xff1a; 解决&#xff1a;mn最多一个素数&#xff0c;都为0无答案&#xff1b;m和n本身也可能是素数。 题目2&#xff1a;7-12 约分最简分式 提交列表&#xff1a; 流程图&…

字符数组的应用

一维数组 char s[10]; s可以存储的字符串的最大长度&#xff08;字符串中字符的个数&#xff09;为9个字符&#xff0c;在最后一个字符后面存储一个字符\0&#xff08;ASCII码为0的字符&#xff09;作为字符串的结束标志 char s2[10]{"student"}; char s3[10]&quo…

华为徐文伟:后香农时代,面向数学的十大挑战问题

本文为2020年8月28日徐文伟在长沙由中国工业与应用数学学会举办的“数学促进企业创新发展论坛”上的发言来源&#xff1a;中国科学院院刊徐文伟华为技术有限公司董事&#xff0c;华为战略研究院院长后香农时代数学决定未来发展的边界数学作为基础的基础&#xff0c;将决定未来发…

06006_redis数据存储类型——String

1、概述 &#xff08;1&#xff09;字符串类型是Redis中最为基础的数据存储类型&#xff0c;它在Redis中是二进制安全的&#xff0c;这意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据或Json对象描述信息等&#xff1b; &#xff08;2&#xff09;在Redis中字符…

C/C++预处理指令

本文主要记录了C/C预处理指令&#xff0c;常见的预处理指令如下&#xff1a; #空指令&#xff0c;无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真&#xff0c;则编译下面代码#ifdef如果宏已经定义&#xff0c;则编译下面代码#ifn…

comparator 多个条件控制_JUnit5学习之四:按条件执行

欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容&#xff1a;所有原创文章分类和汇总&#xff0c;及配套源码&#xff0c;涉及Java、Docker、Kubernetes、DevOPS等&#xff1b;本篇概览本文是《JUnit5学习》系列的第四篇&#xff0c;有时咱们希望测试方法仅在一定…

“星链”或成美军未来作战理念新载体

本文来源&#xff1a;中国军网在美国航天政策愈发重视商业航天发展&#xff0c;尤其是美太空军发展对巨型弹性低轨星座提出重大需求的背景下&#xff0c;美国太空探索公司SpaceX乘势将业务从商业航天发射、载人航天货物和乘员运输逐渐扩展至低轨宽带通信服务&#xff0c;即“星…

基基于多态的职工管理系统

效果 添加 显示 删除 查找 排序&#xff08;不演示了&#xff09; 清空所有 头文件 员工类 #pragma once #include <iostream> #include <string> using namespace std;//职工抽象基类 class Worker { public://显示个人信息virtual void showInfo() 0;//获取…

typescript箭头函数参数_Typescript 入门基础篇(一)

Typescript 基础Typescript是Javascript的一个超集。以下typescript简称为ts, 此文章主要是对ts官网文档的一个简化&#xff0c;缩短学习基础时间。类型基础ts 的类型主要有布尔值、数字、字符串、数组、元组、枚举、Any、Void、Null和Undefined、Never。# Boolean let boo : b…

sublime学习笔记

学习课程地址&#xff1a;快乐的sublime编辑器_sublime编辑器使用 另可参考笔记地址&#xff1a; http://c.haoduoshipin.com/happysublime/ http://blog.csdn.net/u014465934/article/details/72810763 PS&#xff1a;博主的一些文章地址&#xff1a;http://happypeter.github…

里程碑式的数学证明,攻破著名Erdős猜想中关键障碍

大数据文摘出品来源&#xff1a;wired编译&#xff1a;Canary、Andy最近&#xff0c;两名数学家解决了一个关于整数相加性质最著名猜想中的第一部分。该猜想由匈牙利传奇数学家Paul Erdős于60多年前提出&#xff0c;一个无限整数序列在何时一定会包含至少有三个等差数的模式&a…

浅复制和深复制

浅复制是由默认构造函数实现的&#xff0c;将对应数据成员一一复制。 浅复制 template<class T> Array<T>::Array(const Array<T>&a) {sizea.size;a.list list; }如果主函数中有这样的语句&#xff1a; int main() {Array<int> a(10);Array<…

admin select 2 异步_解决Angularjs异步操作后台请求用$q.all排列先后顺序问题

最近我在做angularjs程序时遇到了一个问题1.页面有很多选择框&#xff0c;一个选择框里面有众多的选择项&#xff0c;和一个默认选定的项,像下面这样(很多选择框&#xff0c;不只一个)&#xff1a;2.众多的选项要从后台接口得到&#xff0c;默认项从另一个后台接口得到&#xf…

产业|世界十大工业自动化公司,你知道几家?

来源&#xff1a;机械前线国内工业自动化行业的竞争激烈&#xff0c;国外工业自动化设备、产品制造商依然控制国内上游产品供应的主要市场&#xff0c;下面来看看国外最赚钱的工业自动化公司有哪些。▶1、德国西门子西门子股份公司(SIEMENSAGFWB:SIE&#xff0c;NYSE:SI)是全球…

12月25晚-12月29日做的两个网页

1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5 <title>仿山东理工大学</title>6 <link rel"stylesheet" href"css/wangye.css">7 <link href"img/favicon.ico" r…