类的入门<C++入门>(跑路人笔记)(1)

简介: 类的入门<C++入门>(跑路人笔记)

前言

介绍了类的一些概念,this指针,默认生成函数和符号重载

面向对象和过程的初步介绍

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

类其实类似于我们C语言中的结构体,不过有对类进行了较多的修改使其更加优秀.


在C语言中我们只能向里面放变量,但是在类里我们可以向里面放函数


如下就是一个类


class date
{
public:
  void Init(int year = 1, int  month = 1, int day = 1)
  {
  _year = year;
  _month = month;
  _day = day;
  }
  void Print()
  {
  cout << _year << "-" << _month << "-" << _day << endl;
  }
private:
  int _day;
  int _month;
  int _year;
};

C++习惯使用class来创建类,不过你是用struct来创建类也是可以的=.=,最好使用class


而且C++中我们可以不用typora来省事了直接可以用类名来创建变量.


如我们就可以直接使用


int main()
{
  date a;
  a.Print();
  return 0;
}

类的定义

class className
{
 // 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号

类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

一般向类中放函数可以有两种情况

  1. 声明定义都放在类中
  2. 值将声明放在类中,把定义放在.cpp的文件里

其中声明定义都放在类中的就如我们下面举的例子一样.

class date
{
public:
  void Init(int year = 1, int  month = 1, int day = 1)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  void Print()
  {
    cout << _year << "-" << _month << "-" << _day << endl;
  }
private:
  int _day;
  int _month;
  int _year;
};

这样放入类中的函数,编译器默认其为内联函数.不过内联函数是建议具体要看编译器.

第二种情况

类似下面代码

image.png

我们一般推荐第二种方式.

(本文为了方便讲解先使用第一种方法)


类的访问限定符与封装

访问限定符

如果我们在C语言中使用结构体来写栈,如果有人不通过我们的函数接口来改变变量也是可以的.

如下图

image.png


我们好好的写好的代码就这么被人随便改了,我们后续再写代码的时候直接就一堆错误,非常痛苦.


于是我们的C++语言就加入了public private protected这三个来保护权力



image.png


public修饰的成员在类外可以直接被访问

protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

class的默认访问权限为private,struct为public(因为struct要兼容C)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

class date
{
public:
  void Init(int year = 1, int  month = 1, int day = 1)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  void Print()
  {
    cout << _year << "-" << _month << "-" << _day << endl;
  }
private:
  int _day;
  int _month;
  int _year;
};

我们的public下到private之间的内容是都是类之外可以访问的.

而我们private到类定义结束的区间都是我们类之外不能访问的.



类的实例化(对象)

和我们的C语言结构体一样我们的类也只是一个蓝图而已,他并没有在建造类的时候占据空间,只有在形成变量的时候才会占据空间.

也就是说我们创建的类其实就类似于一个类型,一个自己定义的类型.

我们把用类创建的变量叫做对象.

image.png


如何计算类的大小

我们的类中既有函数又有变量那么实例化之后的类的大小如何计算呢?

其实和C语言的结构体相同都是用对齐来计算大小的,我们的类虽然内部可以定义和声明函数但是函数并不占据类实例化后的大小.

而我们在类中的函数其实是存储在公共内存中的,无论对象是否相同


image.png


就像我们不在类里的函数一样也都是开辟一次之后就在那一片内存中使用.



image.png

image.png


所以在类中的函数也是和普通函数一样放在一块公共区域中,然后我们将传入的参数压进去进行操作.

也就不放在类中计算大小了.

如果我们不放变量那么类的大小应该是多大呢?

答案是:1—这个1的意思并不是保存了什么,而是为了占位表示对象存在.



this指针

this指针的类型:类类型* const

只能在“成员函数”的内部使用

this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。

this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

这个指针被我们的编译器隐藏起来了.


在上面我们定义函数的时候你可以看见

class date
{
public:
  void Init(int year = 1, int  month = 1, int day = 1)
  {
    _year = year;
    _month = month;
    _day = day;
  }
  void Print()
  {
    cout << _year << "-" << _month << "-" << _day << endl;
  }
private:
  int _day;
  int _month;
  int _year;
};

我在定义Print函数的时候直接写了_year,_month,_day而我们打印的时候也雀氏会打印这些变量保存的内容,其实原因也很简单我们的C++通过隐藏this指针来得到的元素内容.


其实Print这个函数里面的内容应该是这样的.


void date::Print(date* const this)

{

cout << this->_year << "-" << this->_month << "-" << this->_day << endl;

}



因为是在类里所以private的元素也是可以访问的.


this是C++自己创立自己传参自己修饰,我们只需要写_year这种变量名即可.


this指针也跟普通形参一样存储在栈中


this指针其实是可以为空的.只要不在函数内解引用this指针就不会报错.


如下:


image.png


但是如果函数内对this指针进行了解引用就不可以了.


image.png


类<2>


相关文章
|
6天前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
3天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
22 10
|
8天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
39 9
|
3天前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
3天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
3天前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
3天前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
4天前
|
人工智能 分布式计算 Java
【C++入门 一 】学习C++背景、开启C++奇妙之旅
【C++入门 一 】学习C++背景、开启C++奇妙之旅
|
12天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
12天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。