首页 > 编程语言 >C++温故补缺(七):;类的访问控制和继承

C++温故补缺(七):;类的访问控制和继承

时间:2023-03-20 23:24:35浏览次数:38  
标签:box 初始化 访问控制 成员 C++ int 静态 温故 public

类的访问控制和继承

类的静态成员

类的静态成员用关键字static修饰,类似静态变量或静态函数,也是有共享的概念

类的静态变量:

静态变量在类的所有对象中共享,不能再类的定义中初始化,但可以在类外部通过作用域符::来初始化,或通过对象初始化

class box{
    public:
        static int a;
};
int box::a=2;
int main(){
    box b1;
    cout<<b1.a;
}

静态变量也是有作用域的,需要public,调用时,只能通过对象调用,不能直接用类调用

静态成员函数:

类的静态成员函数可以直接被类调用,不需要初始化对象

class box{
    public:
        static void print(){};
};
int main(){
    box::print();
}

和普通成员函数的区别:

  • 静态成员函数没有this指针,只能访问静态成员

  • 而普通成员函数可以访问所有的,包括静态和非静态的成员

类中特殊成员变量的初始化:

  • const常量:必须通过构造函数参数列表初始化

  • 引用变量:必须通过构造函数参数列表初始化

  • 普通静态变量:要在类外通过::初始化

  • 静态整型常量:就是static const int,可以在定义的时候直接初始化

  • 静态非整型常量:要在类外通过::初始化

访问控制范围和继承范围

访问范围:

访问 public protected private
同一个类 yes yes yes
派生类 yes yes no
外部的类 yes no no

一个派生类继承所有基类的方法,除了:

  • 基类的构造函数,析构函数和拷贝构造函数

  • 基类的重载运算符

  • 基类的友元函数

  • 而且,派生类不能用初始化列表去初始化基类的成员,只能在函数体中初始化

继承范围:

继承方式 基类的public成员 基类的protected成员 基类的private成员
public继承 仍为public成员 仍为protected成员 不可见
protected继承 变为protected成员 变为protected成员 不可见
private继承 变为private成员 变为private成员 不可见

c++支持多继承:一个子类可以有多个父类

环状继承:A->D,B->D,C->A,B

这样的继承会使D创建两个对象,如:

#include<iostream>
using namespace std;

class box{
    public:
        box(){cout<<"create object"<<endl;};
};

class A:public box{};
class B:public box{};
class C:public A,public B{};
int main(){
    C c1;
}

要解决上面的问题就要用虚拟继承

格式:class 类名:virtual 继承方式 父类名

class A:virtual public box{};
class B:virtual public box{};
class C:public A,public B{};

上面说了,派生类不继承基类的构造函数,但是可以通过初始化列表调用基类的构造函数来初始化

#include<iostream>
using namespace std;

class box{
    public:
        int a;
        box();
        box(int a){this->a=a;};
};

class square:public box{
    public:
        square(int a):box(a){};
};
int main(){
    square s(23);
    cout<<s.a;
}

使用square(int a):box(a){};调用了基类的构造函数.

派生类继承的成员和本身的成员重名的话,不会覆盖或冲突,因为继承过来变量和本身的变量在不同的内存空间

如:

#include<iostream>
using namespace std;

class box{
    public:
        int a;
        void setA(int a){this->a=a;};
};

class square:public box{
    public:
        int a;
        void setAA(int a){this->a=a;};
};
int main(){
    square s;
    s.setA(10);
    s.setAA(20);
    cout<<s.box::a<<endl;
    cout<<s.square::a;
}

可以用作用域符::访问不同的同名变量

标签:box,初始化,访问控制,成员,C++,int,静态,温故,public
From: https://www.cnblogs.com/Tenerome/p/cppreview7.html

相关文章

  • C++温故补缺(六):友元函数、内联函数和this指针
    友元函数、内联函数和this指针友元函数友元函数是定义在类的外部,但有权访问类的所有私有(private)和保护(protectd)成员.友元函数的原型在类的定义中出现,但它并不是类......
  • C++温故补缺(十五):多线程
    多线程参考:CSDN,知乎传统C++(C++11之前)中并没有引入线程的概念,如果想要在C++中实现多线程,需要借助操作系统平台提供的API,如Linux的<pthread.h>,或windows下的<windows.......
  • C++温故补缺(十四):信号处理
    信号处理信号是由操作系统传给进程的中断,能够提前终止一个程序。在Unix,Linux,MacOS或Windows系统上,都可以通过Ctrl+C产生中断。下面是可以在程序中被捕获的信号,并且可......
  • C++温故补缺(十三):模板
    C++模板模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法......
  • C++温故补缺(十二):动态内存
    C++动态内存同C,C++中也是有堆和栈的概念。栈是函数内部声明的所有变量都所占用空间,堆是程序中未使用的内存,在程序运行期间可用于动态分配。同样也有alloc()分配内存,新增......
  • C++温故补缺(十一):异常
    异常处理参考:cnblogs异常和错误(bug)异常:是程序开发过程中必须考虑的一些特殊情况,是程序运行时可以预料的执行分支。异常是不可以避免的,如0除问题,数组越界问题,文件不存在......
  • C++温故补缺(十):C++文件读写和流
    C++文件和流C++文件的读写流用的是fstream库,它定义了三个新的数据类型:数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstr......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很......
  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......