a_time--授权部分及所用知识点(含转载CONST&)
来源:互联网 发布:淘宝账号怎么找回 编辑:程序博客网 时间:2024/05/20 00:50
VC的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807(10^19)与0~18446744073709551615(约1800亿亿)(10^20)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。
用到了const,
下面为转载的功能:
关键字 const ,确定这个值不会被改变,
(1)char greeting[] = "Hello";
char *p = greeting; // non-const pointer,
// non-const data
如果 const 出现在 * 左边,则指针指向的内容为常量;
const char *p = greeting; // non-const pointer,
// const data
当指针指向的内容为常量时,一些人将 const 放在类型之前,另一些人将 const 放在类型之后 * 之前。两者在意义上并没有区别,所以,如下两个函数具有相同的参数类型:void f1(const Widget *pw); // f1 takes a pointer to a
// constant Widget object
void f2(Widget const *pw); // so does f2
如果 const 出现在 * 右边,则指针自身为常量
char * const p = greeting; // const pointer,
// non-const data
如果 const 出现在 * 两边,则两者都为常量。
const char * const p = greeting; // const pointer,
// const data
(2) STL iterators 以指针为原型,所以一个 iterator 在行为上非常类似于一个 T* 指针。声明一个 iterator 为 const 就类似于声明一个指针为 const(也就是说声明一个 T* const 指针):不能将 iterator 指向另外一件不同的东西,但是它所指向的东西本身可以变化。如果你要一个 iterator 指向一个不能变化的东西(也就是 const T* 的 STL 对等物),你应该用 const_iterator:
std::vector<int> vec;
...
const std::vector<int>::iterator iter = // iter acts like a T* const
vec.begin();
*iter = 10; // OK, changes what iter points to
++iter; // error! iter is const
std::vector<int>::const_iterator cIter = //cIter acts like a const T*
vec.begin();
*cIter = 10; // error! *cIter is const
++cIter; // fine, changes cIter
class_name ( class_name const & source );
是拷贝构造函数的标准声明。
它和如下声明是一个意思
class_name ( const class_name & source );
class_name & source表示source 是另外一个已经存在的class_name类的实例
const表示在我这个拷贝构造函数里面不会修改source的内容。
这种形式是拷贝构造函数,const &代表引用,而且在函数内不可以改变引用所指的内容。即如果出现source.xx=yy这样的语句就会产生编译错误。传递引用比传递类对象的开销要小,因为仅仅就是传递一个指针,所以传类对象的时候一般都是传引用。
//-----------
补充转载是从
关键字:Const,Const函数,Const变量,函数后面的Const
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。
const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。
1.用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void Func(A &a) 存在一个缺点:
“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
问题是如此的缠绵,我只好将“const &”修饰输入参数的用法总结一下。
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
- a_time--授权部分及所用知识点(含转载CONST&)
- 安卓应用所用到的插件及知识点
- 学习笔记 const(部分转载)
- VC++入门实验及部分知识点讲解
- const(部分)
- const的用法及部分面试题解析
- C语言结构体部分--知识点及试题
- C语言结构体部分--知识点及试题
- VS2012 C# InitializeComponent() 的作用 及部分知识点
- oracle行级insert触发器的写法及部分知识点
- 对象授权-转载
- 更新CocoaPods碰到的问题及知识点 转载
- 看看看 const知识点
- const知识点总结
- 关于const知识点总结
- Python:新浪微博应用开发简介(认证及授权部分)
- TCP 和 UDP 的区别及部分端口号(含三次握手形象介绍)
- C++primer(第五版)第五章总结(含部分习题源代码及解析)语句
- 重新理解Java的抽象类和接口(anroid_164)
- 每天一练 2015/04/06 widget的用法
- Java jvisualvm简要说明
- JS中打印DIV
- CEdit一行一行读取字符串
- a_time--授权部分及所用知识点(含转载CONST&)
- 第五周 阅读程序 1
- 实现下拉刷新
- hdu 4006 The kth great number/SBT
- c语言节点定义
- 搜索二叉树
- unity 联机调试(android ios)
- NSOperation
- 草根做项目的经验分享二