首页 > 编程语言 >C++ 类(1)

C++ 类(1)

时间:2024-10-11 22:49:17浏览次数:3  
标签:函数 int C++ public Add class struct

1.什么是类

在C语言中,我们学过结构体,我们可以在结构体里面定义变量

在C++中,我们还可以在结构体里面定义函数

struct Add
{
    int a;
    char b;
    double c;
    int& cal(int a, int b)
    {
        a = a + b;
        return a;
    }
   };
    int main(void)
    {
        struct Add s1;
        int a = 3;
        int b = 4;
        printf("%d\n", s1.cal(a, b));
        return 0;
 }

但是像上面这种结构体,在C++中,更喜欢用class来代替,class就算类

class Add
{
    int a;
    char b;
    double c;
public:  void cal(int a, int b)
    {
        a = a + b;
        printf("%d\n", a);
    }
   };
    int main(void)
    {
        class Add s1;
        int a = 3;
        int b = 4;
        s1.cal(a, b);
        return 0;
 }

细心的人看出来了,除了把struct换成class以外,上面还加了一个public,不加这个public编译就通过不了,我们先来解释一下,什么是public

2.限定符

public是访问限定符

访问限定符有三个 public protected private 

我们学C++初阶可以理解成protected 和 private是一样的,只有到继承多态那可能才会有差别

1.public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4.如果后面没有访问限定符,作用域就到}即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。

这也就能解释了为啥class要额外加一个public了,同样,如果你不想struct里面的函数直接在类外被访问,那么就可以一样去加一个private或者protected

那么我们再来思考一件事,就算结构体有内存对齐,那么类怎么计算大小呢?

同样的类也有结构体对齐的特性,因为在C++中,不管是结构体还是类,其内存模板基本都是相同的

3.类的内存

但是类在计算大小中不会把函数的内存大小算进去

为什么?

class Add
{
    int a;
    char b;
    double c;
public:  void cal(int a, int b)
    {
        a = a + b;
        printf("%d\n", a);
    }
   };
    int main(void)
    {
        class Add s1;
        class Add s2;
        return 0;
 }

我们看这个s1和s2,它们的结构体成员可能不同,但是它们的结构体里面的函数是不是一样了,

既然是一样的,我完全没必要每次创建一个类再去专门创建一个地方存放函数,因此函数是被存放到一块公共区域,所以类的内存大小和其中的函数无关

4.类的声明和定义

我们再来思考第二个问题,类里面的函数可以声明和定义分离吗?

直接使用是不行的,编译器怎么知道这个cal函数是哪的cal函数 ,是哪的函数

想改也很简单,让编译器知道是哪里的函数就可以了(指定类域),也就是把aaa.cpp那个文件的函数改成

void Add::cal(int a, int b)
 {
     a = a + b;
     printf("%d\n", a);
 }

此外,在类里面定义的函数默认是内联函数,也就是在类里面的函数不管你加不加inline,都默认是内联函数。当然如果那个函数太长了,编译器也不会把它当作内联函数

那么再思考,下面这个代码

class Add
{
public:
    int a;
    char b;
    double c;
    void caa(int a, int b)
    {
        a = a;
    }
};

这个a是类的成员的a还是参数a

这个函数内是局部域,所以是局部域的a而不是类域成员的a

但是为了好区分,一搬都会对类的成员做一些标记比如下面这样

class Add
{
public:
    int _a;
    char _b;
    double _c;
    void caa(int a, int b)
    {
        a = a;
    }
};

5.封装

此外,类还有一个作用是封装,比如在顺序表那块,c语言的成员和方法(函数)是分开的,有的人使用比较流氓,不用函数,而是直接改capacity和size的值,
 

c++这个地方规范了很多,我不想让它直接改这些数据,只想让他规规矩矩的用函数去改,这个时候就可以用类了,类的成员是private,我们只用给函数public不给类的成员就可以了!

此外,向上面这个类(Add),需要注意,

 Add::_a = 1;

这样是错误的,因为Add只是声明,没有去开辟空间

应该这样写


    Add s1;
    s1._a = 1;

标签:函数,int,C++,public,Add,class,struct
From: https://blog.csdn.net/Starry_tsx/article/details/142861737

相关文章

  • 实验1 现代C++编程初体验
    实验1:task.cpp1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>5usingnamespacestd;67template<typenameT>8voidoutput(constT&c);910voidtest1();11voidtest2();......
  • c++游戏——四子棋
    欢迎各位点赞和评论,若有问题,欢迎提出Code#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<iomanip>#include<termio.h>usingnamespacestd;constintBLACK=1;constintWHI......
  • C++入门教程
    C++入门教程----------------------------------------------------------一.初识C++---------------------------------------------------------1.什么是C++.c++是一种较为基础的编程语言,虽然没有Python,Scratch那么高级,但是它应用范围很广.不论是信息奥赛还是国......
  • C++常用库函数
    大小写转换islower/isupper函数用于检查一个字符是否为小写或大小字母,需要包含头文件<cctype>,也可以包含万能头文件<bits/stdc++.h>.函数返回值类型为bool类型。intmain(){ charch1='A'; charch2='b'; //使用islower函数判断是否为小写字母 if(islower......
  • 【C++】模板进阶
    【C++】模板进阶一.非类型模板参数二.模板的特化函数模板特化函数模板的特化步骤:类模板特化1.全特化2.偏特化(1)部分特化(2)参数更进一步的限制三.模板分离编译1.什么是分离编译2.模板的分离编译3.解决方法四.模板总结一.非类型模板参数模板参数分为:类类......
  • VS2019/2022配置C++ OpenCV4.10.0环境
    一、下载opencv4.10.0官网链接:https://opencv.org/ 安装的时候记住安装路径,本人安装到E盘 二、新建C++项目1、本人新建C++/CLR.Netframework项目 2、右击打开C++项目属性2.1、添加包含目录 此处本人配置的是绝对地址,拷贝build文件夹到程序目录,然后配置相对地......
  • c++知识点多关键字排序
    在C++中,可以使用std::sort函数结合自定义的比较函数对多关键字进行排序。以下是一个示例代码,演示如何根据两个关键字对结构体进行排序:#include<iostream>#include<vector>#include<algorithm>structItem{intfirstKey;intsecondKey;std::stringname;};//自定......
  • 南沙C++信奥赛陈老师解一本通题 1950:【10NOIP普及组】接水问题
    ​【题目描述】学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n 编号,i号同学的接水量为w。接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙......
  • C#项目传递图像指针到C++项目,并转换成cv::Mat图像
    一、C#传递指针地址到C++项目1、C++代码。新建C++/CLR.NetFramewrok4.8项目 .h文件#pragmaonce#include<opencv2/opencv.hpp>extern"C"__declspec(dllexport)intCropImage(cv::Mat&image,inth,intw);.cpp文件intCropImage(cv::Mat&image,inth,in......
  • C++(继承)
    1.继承1.1基础使用继承就是在一个已经存在的类的基础上新建立一个类,新创建的类拥有之前类的特性。继承是面向对象的三大特性之一,体现了代码复用的思想。已经存在的类被称为“基类BaseClass”或“父类”新创建的类被称为“派生类”或“子类SubClass”下面是一个最简......