一.友元函数
作用:非成员函数访问类中的私有成员
#include<iostream>
using namespace std;
class Simple{
friend void Print(const Simple& s);//友元函数,可以调用Print函数
int n;
public:
Simple(int n):n(n){}
};
void Print(const Simple& s){
cout << s.n << endl;
}
int main(){
Simple s(10);
Print(s);
}
二.const限定符
1.本质:只读
2.写法
const 类型 变量 = 初始值;
const 类型 对象;
类型 const 变量 = 初始值;
类型 const 对象;
注:
- 定义时必须初始化
- 全局作用域声明的
const
变量默认作用域是定义所在文件 -
const
对象只能调用const
成员函数
3.const与指针
1 |
const 指针 |
类型* const 变量 = 初始值; |
指针指向地址不能改变 |
2 | 指向const 对象的指针 |
|
指针指向对象不能改变 |
3 | 指向const 对象的const 指针 |
const 类型* const 变量 = 初始值; |
指针指向地址和对象不能改变 |
4.const与引用
类型 const &变量 = 初始值;
与const 类型& 变量 = 初始值;
都是引用对象不能改变。
5.const与函数的参数和返回值
类型 | 语法 | 作用 | 说明 |
---|---|---|---|
const 参数 |
返回值类型 函数(const 类型 形参) |
函数内部不能改变参数的值 | 这样的参数的输入值 |
const 返回值 |
const 返回值类型 函数(形参列表) |
函数的返回值不能改变 | 常用于字符串/指针 |
const修饰位置 | 作用 |
变量 | 变量不可修改,通常用来替代#define
|
对象/实例 | 对象的成员变量不可修改,只能调用const 成员函数 |
函数参数 | 参数不能在函数内部修改,只作为入参 |
函数返回值 | 返回的结果不能被修改,常用于字符串 |
成员变量 | 只能在初始化列表中初始化 |
成员函数 | 不改变成员变量 |
#include <iostream>
using namespace std;
class Test{
public:
void Print() const{
cout << "Test" << endl;
}
};
void Func(const Test& t){
t.Print();
}
int main(){
Test t;
Func(t);// 变量
Func(Test());// 匿名对象
const Test t2;
Func(t2); // 只读对象
t2.Print();
}
三.static限定符
1.本质:
- 生存周期:整个程序的生存周期。
- 作用域:属于类,不属于对象。
2.语法
class 类名{
static 返回类型 函数(形参列表);
};
3.调用
①通过类名:
类名::函数(实参列表);
②通过对象:
对象.函数(实参列表);
例:
#include<iostream>
using namespace std;
class Simple{
public:
static int n;//将不能在初始化列表里初始化,将只能在类外面初始化
//Simple(int n):n(n){}//初始化列表
/*Simple(int n){//构造函数可以没有
this->n = n;
}*/
void Print(){
cout << n << endl;
}
};
int Simple::n = 0;//要早早初始化
int main(){
Simple::n = 1000; //也可以用类名直接访问
Simple s;
s.n = 200; // 用对象访问
s.Print();
cout << sizeof(s) << endl;//static对象不算在类里
Simple s2;
s2.Print();
}
注:
- 在类定义中声明,但是在类实现中初始化。
- 在声明时需要指定关键字
static
,但是在类外定义时不要指定static
。 - 对象的大小不包含静态成员变量
四.const static限定符
既有static的特点又有const的特点
#include <iostream>
using std::cout;
using std::endl;
class StaticConstTest{
public:
void print(){
cout << test1 << " " << test2 << endl;
}
private:
static const int test1 = 1;//static const/const static成员变量在类初始化必须是数字类型。
static const int test2;
};
/* static */ const int StaticConstTest::test2 = 2;//变量声明处或者类外初始化
int main(){
StaticConstTest sct;
sct.print();
}