C++中的static的各种用法以及引用的本质和用法

# 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();

};

运行的结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值