C++ | 12天学好C++ (Day2)->结构图可视化、代码加通俗理解

12天学好C++系列Day2


第二天 - 220928

目录

12天学好C++系列Day2

第二天 - 220928

3.类(class)和对象(object)

3.1.类的一般定义

3.2.定义一个Rectangle矩阵类

3.3.构造函数constructor

3.4.析构函数destructor

3.5.继承类型

3.6.内联函数inline function

3.7.C++结构 

3.8.C++项目中文件之间的关系


3.类(class)和对象(object)

3.1.类的一般定义

#include <iostream>
using namespace std;
class Circle {
public:
    int radius;
    double getArea();

};
double Circle::getArea() {
    return 3.14 * radius * radius;
}

int main() {
    Circle dount;
    dount.radius = 1;
    double area = dount.getArea();
    cout << "dount's area is :" << area << endl;

    Circle pizza;
    dount.radius = 30;
    area = pizza.getArea();
    cout << "oizza's area is :" << area << endl;

}

 结果:

 3.2.定义一个Rectangle矩阵类

#include <iostream>
using namespace std;
class Rectangle {
public:
    int width;
    int height;
    int getArea();

};
int Rectangle::getArea() {
    return width * height;
}

int main() {
    Rectangle rec;
    rec.width = 5;
    rec.height = 3;  
    cout << "Area is :" << rec.getArea() << endl;


}

 结果:

 3.3.构造函数constructor

[2]C++中的构造函数是在创建对象时自动调用的特殊方法。它通常用于初始化新对象的数据成员。C++中的构造函数与类或结构具有相同的名称。构造函数在创建对象时调用。它构造值,即为对象提供数据,这就是为什么它被称为构造函数。

构造函数没有返回值,因此它们没有返回类型。

构造函数的原型如下:

<class-name> (list-of-parameters);
#include <iostream>
using namespace std;

class Area
{
private:
    int length;
    int breadth;

public:
    // Constructor
    Area() : length(5), breadth(2) { }

    void GetLength()
    {
        cout << "Enter length and breadth respectively: ";
        cin >> length >> breadth;
    }

    int AreaCalculation() { return (length * breadth); }

    void DisplayArea(int temp)
    {
        cout << "Area: " << temp;
    }
};

int main()
{
    Area A1, A2;
    int temp;

    A1.GetLength();
    temp = A1.AreaCalculation();
    A1.DisplayArea(temp);

    cout << endl << "Default Area when value is not taken from user" << endl;

    temp = A2.AreaCalculation();
    A2.DisplayArea(temp);

    return 0;
}
  • 计算矩形的面积并进行显示。
  • 在此程序中,创建了类 Area 来处理与Area相关的功能。它有两个变量:长度和宽度。
  • 定义了一个构造函数,它将长度初始化为 5,将宽度初始化为 2。
  • 我们还有三个额外的成员函数 GetLength()、AreaCalculation () 和DisplayArea () 来分别从用户获取长度、计算面积和显示面积。
  • 创建对象 A1 和 A2 时,由于构造函数的原因,这两个对象的长度和宽度分别初始化为 5 和 2。
  • 然后,调用成员函数 GetLength() 从对象 A1 的用户获取长度和宽度的值。这将更改对象 A1 的长度和宽度。
  • 然后,通过调用AreaCalculation()函数计算对象A1的面积并存储在变量温度中,最后显示出来。
  • 对于对象 A2,不会向用户询问任何数据。因此,长度和宽度分别保持为 5 和 2。
  • 然后,计算并显示 A2 的面积,即 10。

结果为:

 

 3.3.1.构造函数的类型

 默认构造函数:默认构造函数是不需要任何参数的构造函数。它没有参数。它也被称为零参数构造函数。

参数化构造函数:可以将参数传递给构造函数。通常,这些参数有助于在创建对象时对其进行初始化。要创建参数化构造函数,只需向其添加参数,就像向任何其他函数添加参数一样。定义构造函数的主体时,请使用参数初始化对象。

  • 它用于在创建具有不同值的不同对象的各种数据元素时对其进行初始化。
  • 它用于重载构造函数。

复制构造函数: 复制构造函数是使用同一类的另一个对象初始化对象的成员函数。

每当我们为一个类定义一个或多个非默认构造函数(带参数)时,也应该显式定义一个默认构造函数(不带参数),因为在这种情况下编译器不会提供默认构造函数。但是,这不是必需的,但始终定义默认构造函数被认为是最佳做法。

复制构造函数采用对同一类的对象的引用作为参数。详细代码可参考【2】。

3.4.析构函数destructor

析构函数是一个实例成员函数,每当对象要被销毁时,都会自动调用它。这意味着,析构函数是在对象被销毁之前要调用的最后一个函数。

  • 析构函数也是一个特殊的成员函数,如构造函数。析构函数销毁由构造函数创建的类对象。
  • 析构函数与其类名同名,前面带有波浪号 (~)符号。
  • 不可能定义多个析构函数。
  • 析构函数只是销毁构造函数创建的对象的唯一方法。因此,析构函数不能过载。
  • 析构函数既不需要任何参数,也不返回任何值。
  • 当对象超出范围时,会自动调用它。
  • 析构函数释放构造函数创建的对象所占用的内存空间。
  • 在析构函数中,对象在对象创建的反面被销毁。

 这里要注意的是,如果对象是使用 new 创建的,或者构造函数使用 new 来分配驻留在堆内存或可用存储中的内存,则析构函数应使用 delete 来释放内存。

3.4.总结

- 一个类里只能有一个析构函数;

-class后面必须跟

- 析构函数是虚拟的

- Destructor是一个成员函数,当对象被删除/销毁或超出范围时调用。

- C++中使用析构函数的目的是释放在对象的生命周期内分配的所有资源(打开的文件、打开的套接字、数据库连接、资源锁等)。

- cpp文件=>先处理全局文件=>开始main()=>f()=>结束main()=>项目结束

3.5.继承类型

当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。

我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:

  • public成员可以被任何类访问,
  • protected成员限于自己和子类访问。在同一个类中使用,其访问权限相当于私有成员;但是在派生时,他的访问权限相当于公有成员
  • private成员限于自己访问,即仅可在自己的类内使用。

如图所示: 

 

这些概念是面向对象编程的重要材料的隐蔽概念。

限制对不应从外部调用或外部公开的敏感信息的访问。


#include<iostream>
using namespace std;

class Transaction { 
public:
	void init(int amount){
		sum = amount; };
	void send(int amount){ 
		sum -= amount;
	}; 
	void receive(int amount) {
		sum += amount;
	}; 
	void getSum() {
		cout << sum << endl; }; 
private:
	int sum; 
};
int main() {
	Transaction A, B;
	A.init(1000); 
	B.init(2000);
	int amount = 500; 
	A.send(amount); 
	B.receive(amount);
	A.getSum();
	B.getSum(); 
	return 0;
}

 

结果如上所示。

因此,将敏感信息(金额信息)设置为私有,以防止从外部直接访问这些信息。

实际上 A.sum = 100;以这种方式编码会导致编译错误。

​若要从外部访问私有,可以通过类中的公共方法访问它。

如果没有 getSum 函数,则外部看不到 sum 的值。

 3.6.内联函数inline function

 开销overhead: 开销是程序执行流程中出现的现象之一。例如,在程序的执行流程中,需要在远程位置执行代码时,会使用额外的时间、内存和资源的现象。在编程中使用外部函数时尤其如此。

执行流程被中断,并分配堆栈内存以使用该函数。如果有参数,甚至会发生赋值操作。除此之外,您将通过许多步骤来调用函数。在这种情况下,意外的资源消耗是一种开销现象。

为了减少这种开销,通常使用宏函数内联函数进行优化。

- 内联函数解决的问题:当程序编译过程中遇到函数调用的指令时,编译器会保存它的内存地址。函数参数被复制到堆栈上,代码执行后,控制权转移到调用指令。这个过程有时会导致函数调用的开销,尤其是当函数很小并且其执行时间小于切换时间时间。提高程序的执行时间和速度。

#include<iostream>
using namespace std;

inline void printSum(int num1, int num2) {
	cout << num1 + num2 << '\n';
}

int main() {
	cout << 10 + 20 << '\n';
    cout << 2 + 5 << '\n';
	cout << 100 + 400 << '\n';

}

 结果:

  • 与较长的内联函数相比,较小的内联函数具有更高的效率和更好的结果。所以,尽量保持内联函数的长度很小。
  • 尽管这些函数提高了程序的效率并改进了它的执行,但不应该将所有函数都转换为内联函数。如果将较大的函数转换为内联函数,可能会导致代码膨胀并降低程序的运行质量。
  • 总是尝试在类外部定义大函数,因为在类内部定义的函数会自动定义为内联函数,这会对程序产生负面影响。为此,可以使用范围解析 (::)。

 3.7.C++结构 

C++ struct是 C++ Structure 的缩写,是 C++ 中可用的用户定义数据类型。它允许用户将(可能)不同数据类型的数据项组合在一个名称下。

C++ 结构与数组不同,因为数组保存相似数据类型的数据;另一方面,C++ struct 可以存储多种数据类型的数据。

结构中的每个元素都称为一个成员

编程时,有时需要多个变量来表示一个对象,例如

std::string myName;
int myBirthYear;
int myBirthMonth;
int myBirthDay;
...

3.7.1.申明与定义

语法:

struct 结构名称{

     类型成员变量 1;

     类型成员变量 2;

     ……

};

由于结构体是用户新定义的数据类型,在不通知编译器的情况下使用是无法识别的,因此必须在使用前声明。由于结构也是一种数据类型,因此不会单独分配内存,因为仅声明了此状态。 

 3.8.C++项目中文件之间的关系

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天|여름이다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值