thread_local 在跨线程时使用:
eg: A 线程是用来拉取数据的,B 线程是用来更新 UI 的,那么 A在拉去数据后应该通知B线程去更新 UI,因为 A 线程不能更新 UI,此时更新 UI 就应该由 B 线程的 thread_local 去进行(因为只有 B 线程能访问),这样可以防止因为跨线程更新 UI 引起的问题。
const 相比 #define 的优点:
1.const 常量有数据类型,而 #define 没有,编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有安全检查,并且在字符替换时候可能导致意想不到的错误。
2.有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
#include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
std 代表标准命名空间,:: 则是作用域运算符,在这里用于定位到 std 命名空间。
头文件 <iostream> 在这个命名空间内声明了 istream 与 ostream 等 IO 类,同时在 std 内声明了 istream cin; 与 ostream cout; 这两个常用对象。
using namespace std; 的作用是曝光整个 std 名称空间,使其中的所有成员皆可直接使用。
1.static 修饰类的成员变量
#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 修饰类的成员方法
const 修饰--常量---- const修饰的常量代替宏定义
修饰成员变量
const int data;
const 修饰的成员变量必须在构造方法的参数列表初始化(const static int pdata=10;除外)const 修饰的成员变量不能被修改
修饰成员方法
void showData()const{ }
const 修饰的成员函数中不能修改成员变量,不能调用非 const 修饰的函数
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。 我们先举一个静态局部变量的例子,如下:
#include <iostream> void fn(); int main() { fn(); fn(); fn(); } void fn() { static int n=10; std::cout<<n<<std::endl; n++; }
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。
通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量有以下特点:
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
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++ 存储类
std 代表标准命名空间,:: 则是作用域运算符,在这里用于定位到 std 命名空间。
头文件 <iostream> 在这个命名空间内声明了 istream 与 ostream 等 IO 类,同时在 std 内声明了 istream cin; 与 ostream cout; 这两个常用对象。
using namespace std; 的作用是曝光整个 std 名称空间,使其中的所有成员皆可直接使用。
1861C++ 存储类
1.static 修饰类的成员变量
2.static 修饰类的成员方法
const 修饰--常量---- const修饰的常量代替宏定义
修饰成员变量
const 修饰的成员变量必须在构造方法的参数列表初始化(const static int pdata=10;除外)const 修饰的成员变量不能被修改
修饰成员方法
const 修饰的成员函数中不能修改成员变量,不能调用非 const 修饰的函数
1860C++ 存储类
静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。 我们先举一个静态局部变量的例子,如下:
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。
通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量有以下特点: