C++语言入门(五)友元及限定符

一.友元函数

作用:非成员函数访问类中的私有成员

#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对象的指针

const 类型* 变量 = 初始值;

类型 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();
}

 

上一篇:Codeforces Round #198 (Div. 2) 340C


下一篇:qiankun 路由加载404 的情况及碰到的问题