C++ 教程 在线

1864C++ 存储类

thread_local 在跨线程时使用:

eg: A 线程是用来拉取数据的,B 线程是用来更新 UI 的,那么 A在拉去数据后应该通知B线程去更新 UI,因为 A 线程不能更新 UI,此时更新 UI 就应该由 B 线程的 thread_local 去进行(因为只有 B 线程能访问),这样可以防止因为跨线程更新 UI 引起的问题。

1863C++ 存储类

const 相比 #define 的优点:

1.const 常量有数据类型,而 #define 没有,编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有安全检查,并且在字符替换时候可能导致意想不到的错误。

2.有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

1862C++ 存储类

#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

std 代表标准命名空间,:: 则是作用域运算符,在这里用于定位到 std 命名空间。

头文件 <iostream> 在这个命名空间内声明了 istreamostreamIO 类,同时在 std 内声明了 istream cin;ostream cout; 这两个常用对象。

using namespace std; 的作用是曝光整个 std 名称空间,使其中的所有成员皆可直接使用。

1861C++ 存储类

1.static 修饰类的成员变量

  • 1). 静态成员变量是先于类的对象而存在
  • 2). 这个类的所有对象共用一个静态成员
  • 3). 如果静态成员是公有的,那么可以直接通过类名调用
  • 4). 静态成员数据在声明时候类外初始化
#include <iostream>

using namespace std;
class Data
{
public:
    Data(){}
    ~Data(){}
    void show()
    {
        cout<<this->data<<" "<<number<<endl;
    }

    static void showData()//先于类的对象而存在
    {
        //这方法调用的时候不包含this指针
        cout<<" "<<number<<endl;
    }

private:
    int data;
public:
    static int number; //静态数据在声明时候类外初始化
};
int Data::number=0;//静态成员初始化

int main()
{
    Data::showData();//通过类名直接调用


    Data::number = 100;//通过类名直接使用
    Data d;
    d.show();
    d.showData();//通过对象调用

    cout << "Hello World!" << endl;
    return 0;
}

2.static 修饰类的成员方法

  • 1). 静态成员函数是先于类的对象而存在
  • 2). 可用类名直接调用(公有)
  • 3). 在静态成员函数中没有this指针,所以不能使用非静态成员

const 修饰--常量---- const修饰的常量代替宏定义

修饰成员变量

const int data;

const 修饰的成员变量必须在构造方法的参数列表初始化(const static int pdata=10;除外)const 修饰的成员变量不能被修改

修饰成员方法

void showData()const{ }

const 修饰的成员函数中不能修改成员变量,不能调用非 const 修饰的函数

1860C++ 存储类

静态局部变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。 我们先举一个静态局部变量的例子,如下:

#include <iostream>

void fn();
int main()
{
    fn();
    fn();
    fn();
}
void fn()
{
    static int  n=10;
    std::cout<<n<<std::endl;
    n++;
}

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。

通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

静态局部变量有以下特点:

  • 该变量在全局数据区分配内存;
  • 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
  • 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  • 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;