C++ 类

创建: 2019/01/29

完成: 2019/02/03

更新: 2021/04/19 原本忘记分类了,分类到C++

 

声明与定义
 声明  

class myclass {
    // private member
    int a;
protected:
    int b;
public:
    ...
} object-list;

 

 定义

 函数的定义

return-type class-name::func-name(parameter-list) {
    // 函数定义
}

//
void SampleClass::sampleFunction(void) {
    cout << "hello world!";
}

 

 新建  

myclass newInstance(...); // 参数直接指定
myclass newInstance = myclass(...);

 

   
构析函数和解析函数
 构析函数

 和类同名,不带返回值

class SampleClass {
  int a;
public:
  SampleClass(int n);
  ~SampleClass();
  void showA();
};

SampleClass::SampleClass(int n) {
  cout << "start to initialize new instance\n";
  a = n;
}

SampleClass::~SampleClass() {
  cout << "start to kill the instance\n";
}
void SampleClass::showA() {
  cout << "a: " << a << "\n";
}

 

 

 解析函数  类名前加~, 不带参数, 不带返回值
   
   
继承
   

class derived-class-name : access-specifier base-class-name {
    ...
};

 

   
   
   
Object Pointer
 

 ● 和其他类的指针一样

// 声明指针
SampleClass *p; // p为实例的内存地址, *p为实例
// 获取地址
SampleClass p; // p为实例,&p来获取地址

 

 

   
   
   
类,构造体,共用体的关联
 C++的类和结构体的区别

 ● C++的构造体可以有函数, 构析函数,解析函数

 ● 类的成员默认非公开, 结构体成员默认公开(仅此而已)

struct type-name {
    // public函数与属性
    ...
private:
    // 非publi函数与属性
} object-list;

 

 共用体  略 # TODO
   
   
行内函数(inline function)
 

 

inline 函数名(参数) {
    ...
    return ...;
}

 ● 把简单的函数定义成inline函数加快运行

 ● 只是要求, 编译器无法满足时会作为普通函数来编译

 

   
自动inline化
   类内的简单的函数都可以自动设为inline
   
   
   
object的代入
 

 ● 类型相同的可以带入,默认所有数据已比特为单位全部拷贝

 ● 带入只是复制值, 两个实例任然是不一样的地址

   
向函数传递object
 

 

void letMeLookLook(Sample t) {
    ...
}

 

 ● 和自带类型一样声明参数类型

 ● 带入是复制

 ● 复制的instance不会呼出构析函数,解放时会呼出解析函数

   
从函数返回object
 

 

Sample test() {
    return Sample(1);
}

 ● 和自带类型一样声明返回类型即可

 ● 函数内部用于返回的在函数结束时即会呼出解析函数并释放内存

 ● 返回出来的是函数内部的instance的复制(不同内存地址), 此instance在函数返回值后即释放

 ● 解析函数里有释放内存操作的返回后会有运行错误(因为内存被释放)

 

   
   
   
friend函数
 

 可以获取类的private成员的外部函数

class Sample {
    int a;
public:
    Sample() {...}
    friend int friendFunction(Sample o1); // friend函数声明
}

int friendFunction(Sample 01) { // 定义不需要加friend
     ...
}

 

 ● friend函数也可以是其他类的函数

 用途

 ● 运算符重载

 ● 用于编写某种输入输出函数

 ● 检验/获取类的非公开属性

 ● ...

   
继承  
 对母类的access权限管理

 

class 类名 : 范围修饰符 继承的类 { // 省略的话默认为private, struct则为public
    ...
}

//
class Sample : public SuperClass {
    ...
}

 

 ● 范围修饰符public, protect, private

 public

 母类的public -> public

 母类的protected -> protected

 母类的private -> private

 protect

 母类的public -> protect

 母类的protected -> protected

 母类的private -> private

 private

 母类的public -> private

 母类的protected -> private

 母类的private -> private

 

 ● 制定要继承的类的public的内容在当前类的范围

 ● 省略的话默认为private, struct则为public

 protect 

 ● 只有此类和继承此类的类能用, instance不能用

 

 构析函数,解析函数的继承

 

 构析函数

 从根类一直运行到当前类

class Sample : protected Base {
    ...
public:
    Sample(参数) : Base(参数) {
    ...
    }
}

//
class Sample : protected Base {
    ...
public:
    Sample(int a, int b) : Base(b) {
    ...
    }
}

 

 

  解析函数  从当前类一直运行到根类 (没有参数, 所以不需要制定)

 

 多重继承

 从左往右都好隔开

class 新建的类 : 范围修饰符 母类1, 范围修饰符 母类2, ... {}

 

 ● 构析函数运行顺序

 母类1, 母类2, ..., 新建的类

 ● 解析函数运行顺序

 新建的类, ..., 母类2, 母类1

 假想母类

 ● 多重参照时,两个母类共同继承了同一个更上层的母类时, 新类会有两个一样的母类

 ● 为防止这种情况, 在继承的时候加上virtual

class 新建的类 : virtual 范围修饰符 母类 { ... }

 

 

原文链接: https://www.cnblogs.com/lancgg/p/12239513.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 类

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325699

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:26
下一篇 2023年3月1日 下午3:27

相关推荐