2025-1-25 c++学习中关于static,初始化列表,友元函数和友元类的问题
1.static
在类中,不仅成员变量可以加static,成员函数也可以加static,成员函数加上static之后只能在函数中访问静态变量,在成员变量private的情况下加上static过后,改成员变量就变为全局的了,在主函数中不能直接访问或者修改,需要在public区写上获取静态成员变量的函数才能访问。加上static后该变量的生命周期就延长了,不会随栈帧的销毁而销毁。
以下代码的作用是计算调用构造函数的次数
#include<iostream>
using namespace std;
class A{
public:
//普通构造
A(){n++;}
//拷贝构造
A(const A& a){n++;}
//创建一个函数用以返回n的值
static int GetN(){//静态函数没有this指针,只能访问类中的静态变量,不能访问非静态的变量
// _a = 10;不能访问
return n;
}
private:
int _a;
static int n;//这儿的n存储在静态区中
};
int A::n = 0;
A& f1(A& a){//这儿形式参数用引用就不用访问拷贝构造,返回值用引用也不用访问拷贝构造。
return a;
}
int main(){
A a1;
A a2;
f1(a1);
f1(a2);
cout << A::GetN() << endl; // 输出A类的静态成员变量n的值
return 0;
}
A& f1(A& a){
return a;
}
//这儿形式参数用引用就不用访问拷贝构造,返回值用引用也不用访问拷贝构造。
4.非static的成员函数可以调用static的成员函数,也可以调用非static的
2.初始化列表
最好所有的成员变量都用初始化列表来定义,而不是在花括号里面定义,因为自定义变量,const修饰的成员变量,引用的定义不能再花括号中定义,只能使用初始化列表来定义。
成员变量在初始化列表中初始化的顺序是成员变量声明的顺序,不是初始化列表出现的顺序
3.友元函数和友元类
友元函数就是把要在类外面访问类里面的私有变量的函数在类中
声明一下,前面加上friend。
友元类就是一个类中的成员变量或者成员函数要访问另一个类中的私有成员变量或者成员函数,就可以将该类设置为友元类,就能正常访问。
友元函数不能用const修饰
#include<iostream>
using namespace std;
class Date{
friend void Modify(Date& d);//友元函数就是把要在类外面访问类里面的私有变量的函数在类中
//声明一下,前面加上friend。
public:
void Print(){
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year = 0;
int _month = 1;
int _day = 1;
};
void Modify(Date& d){
d._year = 2025;
}
int main(){
Date d1;
Modify(d1);
d1.Print();
return 0;
}
- 友元函数不是类的成员函数,而是独立于类的普通函数
- 友元函数的作用是提供一种方式,让外部函数能够访问类的内部数据,而不必通过成员函数。
- const修饰符用于成员函数时,表示该成员函数不会修改对象的任何成员变量(除了mutable成员)
class A {
public:
void print() const {
// 这里不能修改成员变量
}
};
- const修饰符只能用于类的成员函数,因为成员函数可能会修改对象的状态。
- 非成员函数(包括友元函数)本身不属于任何对象,因此没有“对象状态”可以被const修饰符约束。
- 友元函数不能用const修饰:因为它没有对象状态的概念,const修饰符对其没有意义。