const

智能指针与句柄类(二)

心已入冬 提交于 2020-03-30 16:44:12
   之前文章 提到写时复制(copy-on-write)技术,要实现这种功能,针对上文中Handle代码,需要将size_t * use这个抽象出来,封装成一个引用计数类,提供写时复制功能。CUseCount类实现如下: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 ~CUseCount(); 7 8 bool only()const; //判断引用计数是否为0, 句柄类无法访问private int*p, 故提供此函数 9 bool reattach(const CUseCount&); //对计数器的操作, 用来代替 operator = 10 11 bool makeonly(); //写时复制, 表示是否需要赋值对象本身 12 13 private: 14 CUseCount& operator=(const CUseCount&); //提供reattach函数代替 operator = 15 int *p; //实现计数 16 }; 17 18 CUseCount::CUseCount():p(new int(1)) 19 {} 20 21 CUseCount::CUseCount(const CUseCount& u):p(u.p) 22 { 23 ++

C++ Primer Summary 02

孤人 提交于 2020-03-30 16:12:29
标识符:变量名,即变量的标识符;C++中的标识符都是大小写敏感的。 初始化:复制初始化和直接初始化。直接初始化效率更高。 初始化不是赋值:初始化既创建变量又赋初始值,赋值则是擦除对象的当前值并用新值代替。 系统有时候会帮我们初始化变量,系统提供什么样的值取决于变量的类型以及定义的位置。 未初始化的变量引起运行问题:可能会导致程序错误执行和/或错误计算,问题出在未初始化的变量事实上都有一个值,编译器指定变量的内存地址,该地址原有数值依然存在。建议每个内置类型的对象都要初始化。 声明和定义:声明用于向程序表明变量的类型和名字。定义也是声明。但声明不是定义。可以使用extern声明变量。 extern int i;//declares but not define i int i;//declares and define i extern double i = 0;//definition C++语言中,变量必须且仅能定义一次。 变量名相同,在局部作用域中局部变量会屏蔽全局变量。 函数外部的名字具有全局作用域。类作用域、命名空间作用域、语句作用域、局部作用域。 const限定符把一个对象转换成一个常量,定义const对象时必须初始化。 const对象默认为文件的局部变量。与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件钟

C++ Primer 第二章 变量和基本类型

本小妞迷上赌 提交于 2020-03-30 16:10:30
2.3.5 声明和定义 为了让多个文件访问相同的变量,C++区分了声明和定义. 可以通过使用extern关键字声明变量名而不定义它. extern int i; // declares but does not define i int i; // declares and defines i extern 声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。 如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern.只有当extern声明位于函数外部时,才可以含有初始化式. 2.4 const 限定符 const 对象默认为文件的局部变量 非const变量默认为extern.要使const变量能够在其他的文件中访问,必须显式地指定它为extern. 2.5 引用 引用就是对象的另一个名字,在实际程序中,引用主要用作函数的形式参数。 引用是一种复合类型,复合类型是指用其他类型定义的类型。 引用必须用与该引用同类型的对象初始化:(定义引用时必须初始化) int &refVal3 = 10; //error:initializer must be an object const 引用:指向const对象的引用: const int ival = 1024; const int &refVal = ival; int &ref2 = ival;/

《C++ Primer》学习笔记---第2章 变量和基本类型

只谈情不闲聊 提交于 2020-03-30 16:10:01
1. 变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中变量有且只能定义一次。 声明(declaration)用于向程序表明变量的类型和名字。可以用extern关键字声明变量而不定义它,extern声明不是定义,也不分配空间。事实上,它只是说明变量定义在程序的其他地方,程序中的变量可以声 明多次,但只能定义一次。 2. const限定符可以把一个对象转换成一个常量。因为常量在定义后就不能被修改了,所以const定义时必须初始化。 除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问; 非const变量默认为extern。要使const变量能够在其他文件中访问,必须显式的指定它为extern,否则只能在本文件中使用,不能被其他文件访问。 3. 引用只是对象的另一个名字,必须在定义引用时进行初始化,初始化是指明引用指向哪个对象的唯一方法。 非const引用只能绑定到与该引用同类型的对象,const引用则可以绑定到不同但相关的类型的对象或绑定到右值 Eg:double dval = 3.14; const int &ri = dval; std::cout << ri << std::endl; 输出的ri是3,而const int &ri = dval;改成int &ri =

ACM模板(持续更新)

十年热恋 提交于 2020-03-30 15:55:48
数据的离散化存储+去重 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+7; 4 int a[maxn]; 5 vector<int> g; 6 int getid(int x) 7 { 8 return lower_bound(g.begin(),g.end(),x)-g.begin()+1; 9 } 10 int main() 11 { 12 int n; 13 cin>>n; 14 for(int i=0;i<n;++i){ 15 cin>>a[i]; 16 g.push_back(a[i]); 17 } 18 sort(g.begin(),g.end()); 19 g.erase(unique(g.begin(),g.end()),g.end()); 20 return 0; 21 } View Code KMP 1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 void get_next(char *str,int *next,int len) 6 { 7 int i=0,j=-1; 8 next[0]=-1; 9 while(i<len) 10 { 11 if

页面间传值

我们两清 提交于 2020-03-30 15:22:50
发送页: this.props.navigation.navigate('BindSubscriptions', { assetId: this.state.assetId }) this.props.navigation.navigate('AssetDetails', {item}); this.props.navigation.navigate('DriveMoreInfo', { info: this.state.data, itemId: itemId, assetType: G_ASSET_TYPE, assetName: G_ASSET_NAME,}); 接收页: assetId: this.props.navigation.state.params.assetId, const item = this.props.navigation.getParam('item');itemId = item.id; const info = this.props.navigation.getParam('info'); //获取上页传递的内容itemId = this.props.navigation.getParam('itemId'); //获取上页传递的内容G_ASSET_TYPE = this.props.navigation.getParam('assetType')

多线程中volatile关键字的作用

随声附和 提交于 2020-03-30 12:49:08
原文链接: https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写、难验证、难调试、难维护,这通常是件苦差事。不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误。 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助。这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争。令人惊异的是,我们将让编译器尽其所能来帮助你做这些事。 仅仅一个不起眼的关键字。 尽管C和C++标准对于线程都明显的“保持沉默”,但它们以volatile关键字的形式,确实为多线程保留了一点特权。 就象大家更熟悉的const一样,volatile是一个类型修饰符(type modifier) 。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。下面我们来一个个说明。 考虑下面的代码: 代码: class Gadget { public: void Wait() { while (!flag_) { Sleep(1000); // sleeps for 1000 milliseconds }

[CF]Round511

房东的猫 提交于 2020-03-30 12:12:23
这场比赛我及时的参加了,但是打的时候状态实在是太烂了,只做出来了Div2的AB题。 A Little C loves 3 I 直接构造就行。 B Cover Points 应该很容易就看出来这个等腰三角形的腰是坐标轴,然后就用 \(y=b-x\) 的一次函数往上套就行了。 C Enlarge GCD 这个题比赛的时候我交了4次,没有一次想到要先除gcd的。实际上在赛场上我已经接近正解了,就是枚举素因子,然后把最多的那个留着,其他的删掉就好了啊。 好吧,说起来简单,真正要把代码写到AC还是要看std的(摔 话说std的码都好短啊。 Code: #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> const int N = 15000000+10; const int M = 3e5 + 10; int pri[N], notp[N], sz; int n, d[N], a[M]; void get_pri() { notp[1] = 1; for (int i = 2; i < N; ++i) { if (!notp[i]) notp[i] = pri[++sz] = i; for (int j = 1; j <= sz; ++j) { int k =

c语言const、volatile问题小结

≡放荡痞女 提交于 2020-03-30 11:45:57
之前百度面试的时候被volatile虐了,内核中很多地方也会用到,这个面试的时候出现概率太大了,所以搜集了一些结果供大家参考,大部分是百度到的,说得挺明确的,以后读代码的时候遇到了再更新。 百度知道有人提如下问题: #include "stdio.h" int main(void){ const char i = 1; char * j = (char *)&i; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,1 *j = 2; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,2 *j = 3; printf("%d,%d,%p,%p\n",i,*j,&i,j);//1,3 } 为什么i没有改变呢,各位运行也会发现,他们的地址都是一样的。 醉了,我debug的时候,i也是随着j改变的,但是输出时,i就变成1了。希望各位能够从编译的角度上说一下这个问题。 我对答案有稍微修改,对比vc编译结果差不多所以就引用别人的图了 1.这是有const修饰与无const修饰的汇编代码 变量i存储在eax寄存器中,有const修改表达寄存器的值不允许被修改 第22行的时候,对*j=2;赋值时,有const修饰的会对edx进行操作 而没有const进行修饰的就是直接对eax进行操作. 至于编译器调试模式下 , 看见的 i 的值变成 2,

专题训练之树状数组

一曲冷凌霜 提交于 2020-03-30 09:18:20
推荐几个博客:https://blog.csdn.net/int64ago/article/details/7429868搞懂树状数组 https://blog.csdn.net/z309241990/article/details/9615259区间修改 https://blog.csdn.net/whereisherofrom/article/details/78922383完整版+题集 http://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html二进制思想求第k大数 http://www.cnblogs.com/oa414/archive/2011/07/21/2113234.html二分/二进制思想求第k大数 一维树状数组模板(区间求和、单点修改) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+10; 6 int bit[maxn],n; 7 8 int lowbit(int x) 9 { 10 return x&(-x); 11 } 12 13 void add(int k,int num) 14 { 15 while ( k<=n ) { 16