当前位置:   article > 正文

C++:符号的作用【::(命名空间、类、结构体作用域限定符)】【:(类的继承、初始化列表、)】【A.B(A必须为对象或结构体)】【A->B(箭头左边必须为指针),A只能是指向类、结构体、联合体的指针】_c++ ::符号作用

c++ ::符号作用

一、::(作用域运算符

::作用域运算符

  • A::B表示作用域A中的-名称B;
  • A可以是命名空间结构体

1、类作用域操作符

“::”:指明了成员函数所属的。如:M::f(s) 就表示函数 f(s) 是类 M 的成员函数。

  • 如果想在类的外部引用静态成员函数,或在类的外部定义成员函数都要用到 “::”
  • 使用命名空间里的类型或函数也要用到 “::”(如:std::cout, std::cin, std::string 等等)

例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,

demo01.h(在头文件demo01.h中声明类A)

  1. // 声明类 A
  2. class A{
  3. public:
  4. void f();
  5. };

那么在类外定义 f 时, 就要写成 void A::f(){...},表示这个 f() 函数是类A的成员函数。

demo01.cpp(在源文件demo01.cpp中定义类A的成员函数)

  1. void A::f(){
  2. std::cout<<"hello world"<<std::endl;
  3. }

2、作用域成员运算符

表示引用成员函数及变量

例:System::Math::Sqrt() 相当于System.Math.Sqrt()

3、命名空间操作符

  1. namespace ns1 {
  2. const double RATE = 0.08; //常量
  3. double pay; //变量
  4. double tax() { //函数
  5. return a * RATE;
  6. }
  7. namespace_ns2 { //嵌套的命名空间
  8. int age;
  9. }
  10. }

如果想输出命名空间nsl中成员的数据,可以采用下面的方法:

  1. cout<<ns1::RATE<<endl;
  2. cout<<ns1::pay<<endl;
  3. cout<<ns1::tax()<<endl;
  4. cout<<ns1::ns2::age<<endl; //需要指定外层的和内层的命名中间名

可以看到命名空间的定义方法使用方法与类差不多。但它们之间有一点差别:

  • 声明类时在右花括号的后面有一分号;
  • 而在定义命名空间时,花括号的后面没有分号;

二、:

1、类的继承

类名冒号后面的是用来定义类的继承。

这里的冒号起到的就是声名基类的作用,在基类类名前面可以加public/private/protected等标签,用于标识继承的类型,也可以省略, 省略的话:

  • 用class定义的类默认为private;
  • 用struct定义的类默认为public;

初始化列表一样的,这里也可以声名多个基类,各基类之间用逗号(,)隔开。

  1. class 派生类名 : 继承方式 基类名1 , 继承方式 基类名2 …{
  2. 类成员变量
  3. 类成员函数
  4. ...
  5. }
  1. class Derived : public Base1, public Base2{
  2. public:
  3. Derived();
  4. ~Derived();
  5. };

2、在构造函数后面初始化列表(“:”起分割作用)

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

构造函数,就是与类同名的函数,它与普通函数的区别在于,它没有返回类型。

在构造函数后面紧跟着冒号加初始化列表,各初始化变量之间以逗号(,)隔开。

类名::构造函数:变量A(值),变量B(值),...{}
  1. class myClass {
  2. public :
  3. myClass();// 构造函数,无返回类型,可以有参数列表,这里省去
  4. ~myClass();// 析构函数
  5. private:
  6. int a;
  7. const int b;
  8. }
  9. myClass::myClass():a(1), b(1) {} // 初始化列表
  • 初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的。
    • 在初始化列表中是对变量进行初始化操作
    • 在构造函数内是进行赋值操作
  • 初始化列表构造函数内进行成员变量的赋值两者的差别在对于像const类型数据的操作上表现得尤为明显:const 类型的变量必须在定义时进行初始化,而不能对const型的变量进行赋值因此const类型的成员变量只能(而且必须)在初始化列表中进行初始化;
    1. myClass::myClass() {
    2. a = 1;// 对,效果相当于在初始化列表中进行初始化
    3. b = 1;// 错,const变量不能进行赋值操作;
    4. }

    如果在构造函数中对const类型的变量赋值,则会出错

  • 初始化列表中变量的顺序要与成员变量声明时的顺序相同。
    myClass::myClass():b(1),a(b){}

    这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。

3、结构体变量初始化

  1. typedef struct {
  2. unsigned char a:4;
  3. unsigned char c;
  4. } XXX;

4、public:和private:后面的冒号

public:和private:后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个"public:”或"private:”出现为止。

"private:"为默认处理。

5、条件语句(条件表达式?表达式1:表达式2)

与?构成条件语句,作用相当于if else,如下;

  1. int a,b,c;
  2. a=3;
  3. b=2;
  4. c=a>b?a:b;// 如果a>b成立,则反a赋给c,否则把b赋给c

条件语句的结构为:

条件表达式?表达式1:表达式2

条件表达式为true时,表达式的值为表达式1的值,否则为表达式2的值。

三、符号.和->的作用和区别

1、A.B

A.B则A为对象或者结构体;

点号(.)左边必须为实体

2、A->B

A->B:

  • A为指针
  • ->是成员提取,
  • A->B是提取A中的成员B,
  • A只能是指向类、结构体、联合体的指针;

箭头(->)左边必须为指针

C++中::和:, .和->的作用和区别? - 知乎

C++中::和:, .和->的作用和区别

C++ 类的继承_Remarkable!的博客-CSDN博客_c++类的继承 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/51531
推荐阅读
相关标签
  

闽ICP备14008679号