12天学好C++系列Day2
目录
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++项目中文件之间的关系
#include
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;
}
结果:
#include
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;
}
结果:
[2]C++中的构造函数是在创建对象时自动调用的特殊方法。它通常用于初始化新对象的数据成员。C++中的构造函数与类或结构具有相同的名称。构造函数在创建对象时调用。它构造值,即为对象提供数据,这就是为什么它被称为构造函数。
构造函数没有返回值,因此它们没有返回类型。
构造函数的原型如下:
(list-of-parameters);
#include
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;
}
结果为:
默认构造函数:默认构造函数是不需要任何参数的构造函数。它没有参数。它也被称为零参数构造函数。
参数化构造函数:可以将参数传递给构造函数。通常,这些参数有助于在创建对象时对其进行初始化。要创建参数化构造函数,只需向其添加参数,就像向任何其他函数添加参数一样。定义构造函数的主体时,请使用参数初始化对象。
复制构造函数: 复制构造函数是使用同一类的另一个对象初始化对象的成员函数。
每当我们为一个类定义一个或多个非默认构造函数(带参数)时,也应该显式定义一个默认构造函数(不带参数),因为在这种情况下编译器不会提供默认构造函数。但是,这不是必需的,但始终定义默认构造函数被认为是最佳做法。
复制构造函数采用对同一类的对象的引用作为参数。详细代码可参考【2】。
析构函数是一个实例成员函数,每当对象要被销毁时,都会自动调用它。这意味着,析构函数是在对象被销毁之前要调用的最后一个函数。
这里要注意的是,如果对象是使用 new 创建的,或者构造函数使用 new 来分配驻留在堆内存或可用存储中的内存,则析构函数应使用 delete 来释放内存。
3.4.总结
- 一个类里只能有一个析构函数;
-class后面必须跟;
- 析构函数是虚拟的
- Destructor是一个成员函数,当对象被删除/销毁或超出范围时调用。
- C++中使用析构函数的目的是释放在对象的生命周期内分配的所有资源(打开的文件、打开的套接字、数据库连接、资源锁等)。
- cpp文件=>先处理全局文件=>开始main()=>f()=>结束main()=>项目结束
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:
如图所示:
这些概念是面向对象编程的重要材料的隐蔽概念。
限制对不应从外部调用或外部公开的敏感信息的访问。
#include
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 的值。
开销overhead: 开销是程序执行流程中出现的现象之一。例如,在程序的执行流程中,需要在远程位置执行代码时,会使用额外的时间、内存和资源的现象。在编程中使用外部函数时尤其如此。
执行流程被中断,并分配堆栈内存以使用该函数。如果有参数,甚至会发生赋值操作。除此之外,您将通过许多步骤来调用函数。在这种情况下,意外的资源消耗是一种开销现象。
为了减少这种开销,通常使用宏函数和内联函数进行优化。
- 内联函数解决的问题:当程序编译过程中遇到函数调用的指令时,编译器会保存它的内存地址。函数参数被复制到堆栈上,代码执行后,控制权转移到调用指令。这个过程有时会导致函数调用的开销,尤其是当函数很小并且其执行时间小于切换时间时间。提高程序的执行时间和速度。
#include
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';
}
结果:
C++ struct是 C++ Structure 的缩写,是 C++ 中可用的用户定义数据类型。它允许用户将(可能)不同数据类型的数据项组合在一个名称下。
C++ 结构与数组不同,因为数组只保存相似数据类型的数据;另一方面,C++ struct 可以存储多种数据类型的数据。
结构中的每个元素都称为一个成员。
编程时,有时需要多个变量来表示一个对象,例如
std::string myName;
int myBirthYear;
int myBirthMonth;
int myBirthDay;
...
3.7.1.申明与定义
语法:
struct 结构名称{
类型成员变量 1;
类型成员变量 2;
……
};
由于结构体是用户新定义的数据类型,在不通知编译器的情况下使用是无法识别的,因此必须在使用前声明。由于结构也是一种数据类型,因此不会单独分配内存,因为仅声明了此状态。