C++基础 class、struct、union详细

目录
  • 1、类class
  • 2、结构体struct
  • 3、共用体union

1、类class

类是面向对象中的特性,在c中是没有类的概念。通常用class来表示,cpp中有抽象类,但是没有接口这种说法,cpp支持多继承。

一个普通的类:

class Fruit
{
    private:

    public:
        Fruit();
        ~Fruit();
};

Fruit::Fruit()
{
}

Fruit::~Fruit()
{
}

构造函数和析构函数:

其中Fruit()表示构造函数, ~Fruit()表示析构函数。构造函数用来创建对象,设置初始化参数。析构函数在对象销毁的时候执行。

修饰符:

private:表示私有成员,外部不可访问,只有自身类和友元函数可以访问。
public:表示公共成员,外部可以访问。
protected:表示保护成员,保护成员和私有成员相似,但是子类可以访问保护成员。

类中的成员函数:

我们在类中创建函数的时候,可以直接初始化,或者在类外部实现:

class Fruit
{
    private:
        int count;
    public:
        Fruit();
        ~Fruit();

        void add(int i);

        //直接初始化
        int getCount(){
            return count;
        }
};

Fruit::Fruit()
{
    cout << "create fruit" << endl;
}

Fruit::~Fruit()
{
    cout <<"fruit deleted"<<endl;
}

//在类外部实现
void Fruit::add(int i){
    count = count + i;
}

友元函数:

友元函数虽然可以在类中定义,但是它不属于类的成员函数,必须在类外部实现。它可以访问定义类中的privateprotected成员。

友元类:友元类中的所有函数都是该类的友元。

#include <iostream>
using namespace std;

class Fruit
{
    private:
        int count = 0;
    public:
        Fruit();
        ~Fruit();

        // friend void printF(Fruit ft);
        friend void printF(Fruit &ft);
};

// void printF(Fruit ft){
//     cout << ft.count <<endl;
// }

void printF(Fruit &ft){
    cout << ft.count <<endl;
}

int main(){

    Fruit fruit;

    printF(fruit);

    return 0;
}

this指针: 类的成员函数中都可以用this指针来访问类成员,this指针是const指针,不可修改。

虚函数纯虚函数抽象类

虚函数: 使用关键字virtual修饰

        virtual void fuck2(){
            cout <<"fuck 2"<<endl;
        }

虚函数表示被子类重写的时候,调用子类的函数而不是父类的此函数

纯虚函数:空的虚函数

virtual void fuck() = 0;

抽象类: 只要类中有纯虚函数就代表是抽象类

抽象类是被实体化的,必须通过子类创建。

class Fruit
{
    private:
    public:
        Fruit();
        ~Fruit();
        virtual void fuck() = 0;

        void fuck1(){
            cout <<"fuck 1"<<endl;
        }

        virtual void fuck2(){
            cout <<"fuck 2"<<endl;
        }
};

继承: 注意继承需使用public修饰,

class Apple: public Fruit
{
    private:

    public:
        Apple();
        ~Apple();

        void fuck(){
            cout << "fuck apple"<<endl;
        };

        void fuck2(){
            cout << "fuck apple 22"<<endl;
        };

};

调用看输出结果:

    Apple apple;
    apple.fuck();
    apple.fuck1();
    apple.fuck2();

输出:

fuck apple
fuck 1
fuck apple 22

  • fuck()是纯虚函数,调用的是子类
  • fuck1()调用的是父类的方法
  • fuck2()因为是虚函数,又被子类重写了,所以调用的是子类。如果子类不重写虚函数,还是会调用父类的。

多继承如下:

class Apple: public Fruit, public Orange{

}

2、结构体struct

cpp可以用struct来创建自定义数据结构,相当于java中的bean

创建一个基本的结构体:

struct Book
{
    string name;
    int id;
    long int ISBN;
};

可以在} ;之间创建一个或多个结构体对象:

struct Book
{
    string name;
    int id;
    long int ISBN;
}book1,book2;

数据局初始化:

  <!--直接赋值:-->
    book1.name = "C++ programing";

    <!--或者创建的时候初始化:-->
    Book book3{
        "Android++",
        1,
        21321231
    };

    cout<<book3.id<<endl;
    cout<<book3.name<<endl;
    cout<<book3.ISBN<<endl;

使用类型别名:

typedef struct{
    int id;
    string name;
}Ebook;

我感觉是无用的语法糖。

结构体指针:

    Ebook ebook{
        2,"啊哈哈哈"
    };

    Ebook *ptr_book;
    ptr_book = &ebook;

    cout<< ptr_book->id <<endl;
    cout<< ptr_book->name <<endl;

和普通指针没啥区别

结构体和class的区别在哪里?

  • 总的来说,struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。
  • 默认的继承访问权限:struct 默认是public的,class默认是private的。

c和cpp中的struct有什么不同?

  • c中只能作为数据的结构体,不能有函数,cpp中struct是可以有函数的
  • c中没有修饰符,cpp中结构体可以有publicprotectedprivate修饰符
  • c中创建结构体必须加struct前缀,比如:struct Book book,真是book思议
  • c中没有继承概念,cpp中struct可以继承

演示:

struct TBook : public Book
{
    private:
        int ids = 1232342;
    public:
        string names;
        long int TTT;
        void printBook(TBook *book);
}tbook;

void TBook::printBook(TBook *book){
    cout<<book->ids<<endl;
    cout<<book->names<<endl;
    cout<<book->TTT<<endl;

    cout<<book->name<<endl;
}

执行:

    tbook.name = "C++";
    tbook.names = "Android++";
    tbook.TTT = 1213;

    tbook.printBook(&tbook);

输出结果:

1232342
Android++
1213
C++

3、共用体union

共用体类似于结构体,但是只会同时存在一个数据成员,在一个成员被赋值后,其他成员值将会丢失。

union ONE
{
    int i;
    float j;
    double ids[10];
};

int main(){

    ONE one;
    one.i = 123;
    cout << one.i <<endl;

    one.j = 1.0f;
    cout << one.i <<endl;   //one.i将会丢失
    cout << one.j <<endl;

    return 0;
}

共用体特点:

  • 默认访问控制符为 public
  • 可以含有构造函数、析构函数
  • 不能含有引用类型的成员
  • 不能继承自其他类,不能作为基类
  • 不能含有虚函数
  • 匿名 union 在定义所在作用域可直接访问 union 成员
  • 匿名 union 不能包含 protected 成员或 private 成员
  • 全局匿名联合必须是静态(static)的

配合结构体使用:

struct PEOPLE
{
    string name;
    union TEST
    {
        int id;
        float id_f;
    } test;

};

到此这篇关于C++基础 class、struct、union详细的文章就介绍到这了,更多相关C++基础 class、struct、union内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++基础 class、struct、union详细

    目录 1.类class 2.结构体struct 3.共用体union 1.类class 类是面向对象中的特性,在c中是没有类的概念.通常用class来表示,cpp中有抽象类,但是没有接口这种说法,cpp支持多继承. 一个普通的类: class Fruit { private: public: Fruit(); ~Fruit(); }; Fruit::Fruit() { } Fruit::~Fruit() { } 构造函数和析构函数: 其中Fruit()表示构造函数, ~Fruit()表示析构函数

  • 详解c++11以正确的姿势输出enum class的值

    c++11新增了enum class,相比传统的enum好处多了很多,但也有些让人不太爽的地方,如:输出到std流时会报错,进行了强转则没有信息输出,那么,到底该如何将enum class的值出到std流呢? 提供这个enum class的原因是因为旧的enum有不少缺点.简单描述一下: 1. 容易被隐式转换成int 2. underlying type 指的是编译器实现者幕后的实现细节导致了跨平台,跨编译器的不一致性.尺寸的不可估计等等. 3. 没有严格的scope界限 下面,介绍一种通过重载

  • C++调试追踪class成员变量的方法

    比如:int (*foo)(int arg),记住要和另一个指针函数区分开来,类似这样:int *foo(int arg).比如我们可以这样声明一个变量和函数: 复制代码 代码如下: int (*pfun)(int arg)=0;int fun(int arg);    //这个函数实现随便啦,我就不写了. 如果我们想利用函数指针操作函数,就和指针变量使用一样: 复制代码 代码如下: pfun=fun;int result=(*pfun)(123); 对,很鸡肋也没必要.这是当然,因为我们没用在

  • C++ class和struct到底有什么区别详解

    C++ 中保留了C语言的 struct 关键字,并且加以扩充.在C语言中,struct 只能包含成员变量,不能包含成员函数.而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数. C++中的 struct 和 class 基本是通用的,唯有几个细节不同: 使用 class 时,类中的成员默认都是 private 属性的:而使用 struct 时,结构体中的成员默认都是 public 属性的. class 继承默认是 private 继承,而 struct 继承默

  • 深入了解C++ 结构体(struct)与共用体(union)

    编码运行环境:VS2017+Win32+Debug,Win32表示生成32bits的应用程序. 结构体(struct)与共用体(union)是C语言中就已经存在的数据类型,C++对他们进行了扩充,最大的变化是允许在结构和公用体中定义成员函数.下面将通过实例讲解二者的特性和用法. 1.struct 以下是一个使用了结构体的C++程序. #include <iostream> using namespace std; struct Room { int floor; int No; }; stru

  • C++ 关于STL中sort()对struct排序的方法

    前言 一直没有系统去看过c++,因为懂得一些c的基本语法,在实际编程中用到c++,只能用到哪些看哪些,发现这样虽然能够完成大部分工作,但是有时候效率实在太低,比如说这节要讲的Std::sort()函数的使用,调了半天才调通.开通c/c++序列博客是记录在使用c++中一些难题,避免以后重犯错,当然以后会尽量挤出时间来较系统学习下c++. 开发环境:QtCreator2.5.1+OpenCV2.4.3 实验基础 首先来看看std中的快速排序算法sort的使用方法: template <class R

  • c++中typename和class的区别介绍

    相信学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字.它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename T>...... 在模板定义语法中关键字class与

  • 深入C++中struct与class的区别分析

    一.C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗?   能!struct能继承吗?  能!!struct能实现多态吗?   能!!! 最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限.struct是public的,class是private的.   写如下的代码: 复制代码 代码如下: struct A{  char a;}:struct B : A{  cha

  • Python基础之字典的详细使用教程

    目录 一. 什么是字典 二. 创建字典 三. 字典元素获取 四. 字典元素的增删改操作 五. 字典的视图操作 一. 什么是字典 字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据. 二. 创建字典 创建字典的两种方式,一种使用{ } 另一种使用内置函数dict() # author: 爪哇斗罗(javaDouLuo) # date: 2022/7/11 22:51 # 字典的创建 dict01={"A": 1, "B&qu

  • NodeJS基础API搭建服务器详细过程记录

    前言 在习惯了使用express框架,jade模板引擎等现成工具来写代码之后,很多人对于基本的NodeJS API会慢慢生疏.本文将以一个超小型web项目,来详细介绍如何使用NodeJS基础的http, fs, path, url等模块提供的API来搭建一个简单的web服务器.当做对NodeJS的一次复习,也为初学NodeJS的开发者提供一个参考.本文所搭建的项目将不会使用express等后端框架,仅使用最基础的NodeJS API,按照MVC设计模式的思路进行编码和讲解,交流意见.源代码地址如

  • Python基础之getpass模块详细介绍

    本文主要给大家介绍了关于Python中getpass模块的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: getpass模块提供了平台无关的在命令行下输入密码的方法; 该模块主要提供: 两个函数: getuser, getpass 一个报警: GetPassWarning(当输入的密码可能会显示的时候抛出,该报警为UserWarning的一个子类) 备注: 上面为密码显示时抛出的报警 getpass.getuser() 该函数返回登陆的用户名,不需要参数 该函数会检查环境变

  • Java基础之数组超详细知识总结

    一.一维数组 1.Java语言中的数组是一种 引用数据类型.不属于基本数据类型.数组的父类是 Object. 2.数组实际上是一个容器,可以同时容纳多个元素.(数组是一个数据的集合) 3.数组当中可以存储"基本数据类型"的数据,也可以存储"引用数据类型"的数据. 4.数组因为是引用类型,所以数组对象存储在 堆内存 当中.(数组是存储在堆当中的) 5.数组当中如果存储的是"java对象"的话,实际上存储的是对象的"引用(内存地址)&quo

  • 彻底吃透理解Python基础33个关键字详细教程

    目录 1 and.or.not 2 if.elif.else 3 for.while 4 True.False 5 continue.break 6 pass 7 try.except.finally.raise 8 import.from.as 9 def.return 10 class 11 lambda 12 del 13 global.nonlocal 14 in.is 15 None 16 assert 17 with 18 yield 其实前面我已经为大家总结了<Python系统关键

  • C语言基础函数用法示例详细解析

    目录 函数 函数定义 函数一般格式 C语言函数分类 库函数 库函数的分类 库函数的学习 自定义函数 函数的参数 实际参数 形式参数 函数的调用 传值调用 传址调用 无参函数调用 函数的声明和定义 函数的声明 函数的定义 函数声明与定义的区别 exit与return介绍 函数 函数定义 百度百科对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,有一个或者多个语句块组成,它负责完成某项特定的任务,而且相比于其他的代码,具备相对的独立性. 一般来说会有输入参数和返回值,提供对过

  • C语言结构体(struct)的详细讲解

    目录 引言 1. 动态内存管理 2. 结构体 2.1 定义语法 2.2 定义示例 2.3 初始化 2.4 结构体赋值 2.5 结构体数组 2.6 结构体指针赋值 3. 学生管理系统 附:结构体变量的存储原理 总结 引言 当前文章介绍动态堆空间内存分配与释放,C语言结构体定义.初始化.赋值.结构体数组.结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用. 1. 动态内存管理 C语言代码----->编译----->链接------>可执行的二进制文件(windows下x

  • C++内存管理详细解析

    目录 一.C++内存管理 1. new/delete表达式 2.new/delete重载 3.类内自定义allocator(per-class allocator) 二.多线程内存分配器 1.malloc/free 2.brk和mmap 三.补充知识 1.内存泄漏 2.malloc/free和new/delete的比较 3.RAII规则 一.C++内存管理 C++中有四种内存分配.释放方式: 最高级的是std::allocator,对应的释放方式是std::deallocate,可以自由设计来搭

  • C语言详细分析讲解多文件的程序设计

    目录 一.多文件与编译器链接 二.多文件之间的相互访问 三.关于#include 四.头文件使用的一些原则 五.再论全局变量 六.注意事项 七.实验程序 八.小结 一.多文件与编译器链接 如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件. 二.多文件之间的相互访问 每个文件可以定义功能接口(可被其它文件访问的函数或数据) 源文件:代码实现文件,后缀为.c 头文件:源文件的接口定义文件,后缀为.h 当需要使用其它文件提供的功能时,包含对应的头文件 语法: #in

随机推荐