# include <iostream>
// 第一课:static
// static 可以修饰的有三类:类中方法、局部变量、放在全局变量或全局函数之前
// 1. 在类中修饰函数(即类方法),不用新建实例就能运行的类方法。 但是,类方法不能访问非静态变量。
// 2. 花括号和类的局部变量中出现static可以延长内部局部变量的生命周期,使其在整个程序运行过程中都存在。
// 使其在本花括号外可以访问。第一次实例创建后,就能在类中能共享通一片内存天地,访问时用“::”。
// 3. 放在全局变量和全局函数之前,改变了影响范围,使该变量(函数)只在当前cpp文件内可见。
// Singleton的复杂写法
class Singleton_complex
{
private:
static Singleton_complex* s_Instance; //新建一个指向类本身的指针s_Instance
public:
static Singleton_complex& Get() { return *s_Instance; } // 返回是:类本身的指针的解析,*代表解析,也就是返回类自身的引用
void hello() {
std::cout << "Singleton_complex hello!" << std::endl;
}
};
Singleton_complex* Singleton_complex::s_Instance = nullptr; //要让指针在程序运行时一直存在,所以在类外声明,否则报错
// 用局部变量写法后,可以大大的简写上面的形式,也不需要类外声明指针:
class Singleton
{
public:
static Singleton& Get() { //这里的static代表的是类方法,不用新建实例就能运行的类方法
static Singleton instance; //instance定义为局部变量,大大加强instance存在的生命周期
return instance;
}
void hello() {
std::cout << "Singleton hello!" << std::endl;
}
};
int main() {
std::cout << "Class 1:" << std::endl;
Singleton::Get().hello();
Singleton_complex::Get().hello();
std::cout << "================ " << std::endl;
std::cout << "Class 2:" << std::endl;
// 第二课:引用
//关于引用的解释,以int& c = b为例
//引用 的本质就是: 指针的解析的简洁、折叠的写法(可以让代码更易读懂)
//使得写得代码更少:
int b = 5;
//int& c = b的展开形式为:
int* b_ptr = &b; // 取b的地址
int& c = *b_ptr;
//现在c已经是b的引用了,我们尝试更改c的值,看b的值是否改变
std::cout << "The value of B before was 5" << b << std::endl;
c = 20; // 输入 c = 20; 之后,打印b的值就是20。
std::cout << "The value of B now is " << b << std::endl;
//&c也是有效的写法
std::cout << "The Console will print 3 same address:" << std::endl;
std::cout << &c << ", " << &b << ", " << b_ptr << std::endl; //“引用c”本身的地址是不存在的,对引用取地址的结果等于对被引用的变量取地址的结果
std::cin.get();
};
运行的结果: