[C++入门]类和对象下
这一篇我们对类和对象进行一下收尾工作。
目录
一、初始化列表
1、与构造函数的对比
2、注意事项
二,Static函数
1、概念
2、特点
3、static成员函数
特点
三、友元函数
1、概念
2、特点
一、初始化列表
1、与构造函数的对比
说到初始化列表我们很难不联想到构造函数,这里我们一起回顾一下构造函数的特点
与类同名
没有返回类型
可以重载(一个类可以有多个构造函数)
可以是public、protected或private
如果没有显式定义,编译器会生成默认构造函数
既然有了构造函数,为什么还要有初始化列表呢?
执行顺序:
初始化列表的执行先于构造函数体
成员变量的初始化顺序取决于它们在类中的声明顺序,而非初始化列表中的顺序
必须使用初始化列表的情况:
初始化const成员
初始化引用成员
初始化没有默认构造函数的类类型成员
初始化基类(在继承中)
这里我们进行简单举例
class Example {public:Example(int a, int b, AnotherClass& o) : c(a), ref(b), obj(o) {}
private:const int c;int& ref;AnotherClass obj;
};
对于以上这些情况,我们就必须使用初始化列表
同时,使用初始化列表可以直接初始化对象,省去了调用初始化再赋值的过程
2、注意事项
1、初始化顺序:成员变量的初始化顺序是它们在类中声明的顺序,与初始化列表中的顺序无关
如下所示,我们想的是想把x赋值给b,再把b赋值给a。但是由于顺序的问题,a先进行定义,就会报错
class Order {int a;int b;
public:Order(int x) : b(x), a(b) {}
};
2、默认参数:构造函数可以有默认参数,与初始化列表结合使用
class Box {int l, w, h;
public:Box(int length = 1, int width = 1, int height = 1) : l(length), w(width), h(height) {}
};
二,Static函数
static
是C++中一个重要的关键字,当应用于类的成员时,它会改变成员的行为和生命周期。下面我会为大家慢慢介绍
1、概念
static成员变量属于类本身,而不是类的某个特定对象。所有该类的对象共享同一个static成员变量。
2、特点
在内存中只有一份拷贝
必须在类外进行定义和初始化
不依赖于任何对象存在,可以通过类名直接访问
生命周期与程序相同
class Counter {
public:Counter() { count++; } ~Counter() { count--; } static int count;
};int Counter::count = 0; int main() {Counter c1;cout << "当前对象数: " << Counter::count << endl; {Counter c2;cout << "当前对象数: " << Counter::count << endl; } cout << "当前对象数: " << Counter::count << endl; return 0;
}
这个结果中c2在除了作用域后就被销毁掉了,所以count在main中括号结束后随着c2的销毁就变成了1
3、static成员函数
static成员函数属于类本身,而不是类的某个特定对象。它只能访问类的static成员变量和其他static成员函数。
特点
不依赖于任何对象存在,可以通过类名直接调用
没有this指针
不能访问类的非static成员
让我们通过一段代码演示一下
class MathUtils {
public:static double add(double a, double b) {return a + b;}static double multiply(double a, double b) {return a * b;}static double getPi() {return pi;}private:static constexpr double pi = 3.141592653589793;
};int main() {cout << "5 + 3 = " << MathUtils::add(5, 3) << endl;cout << "5 * 3 = " << MathUtils::multiply(5, 3) << endl;cout << "π的值: " << MathUtils::getPi() << endl;return 0;
}
三、友元函数
1、概念
友元函数(friend function)是C++中一种特殊的函数,它可以访问类的私有(private)和保护(protected)成员,即使它不是该类的成员函数。
2、特点
不是类的成员函数,但可以访问类的私有和保护成员
在类内部声明,使用
friend
关键字不受类的访问控制限制(public/private/protected)
没有
this
指针,因为它不是成员函数可以定义在类的任何部分(public/private/protected)
那么什么时候我们要使用友元函数呢?
比方说,为了提高某个函数的访问权限,或者一些要访问多个类私有成员的函数,我们就要用到友元函数,提高访问权限
举个例子吧
#include <iostream>
using namespace std;class Box {
private:double width;public:Box(double w) : width(w) {}friend void printWidth(Box box);
};void printWidth(Box box) {cout << "Box的宽度: " << box.width << endl;
}int main() {Box box(10.0);printWidth(box); return 0;
}
而当屏蔽掉声明之后,就无法访问了