C++ Primer笔记
内存中最小可寻址的单位为字节,1字节为8位,大家都知道~~~
在局部函数中定义一个类会被默认初始化,可以直接使用。定义于函数内部的内置类型的对象如果没有初始化,其值为未定义,而对于函数体之外的,会被初始化为0。
void doSomeThing()
{
MyClass mc;
mc.xxx();
}
C++11支持变量列表初始化,以下初始化方式为正确。
int sold = 0; int sold = {0}; int sold{0}; int sold(0);
列表初始化存在情况为:当内置类型初始化时存在丢失信息风险时,编译器会报错
long double ld = 3.141592653 int a{ld}, n = {ld}; //报错,存在丢失精度的风险 int c(ld), d = ld; //编译通过
变量的声明使用关键字extern
extern int i;
如果在extern中为i赋值,也相当于一次变量的定义(extern 也没有意义了)。
常量和常量表达式在编译期间就能获得它的值,而非常量表达式,比如:
const int sz = get_size();
具体的值只有到运行时才能后去到。
C++11中使用constexpr类型来让编译器验证变量的值是否是一个常量表达式
constexpr int mf = 20; constexpr int limit = mf + 1; constexpr int sz = size(); //只有当size是一个constexpr函数时才是一跳正确的声明语句
C++中由但括号引起来的一个字符成为char类型的字面值,双括号括起来的零个或多个字符则构成的字符串型字面值~~~
需要注意的是因为与C语言兼容和某些历史原因,字符串字面值并不等於string对象,它们属于不同类型。
"hello"; //stirng 类型字面值 'a'; //char类型字面值 //在标准库中允许把字符串的字面值和字符的字面值转换为string对象,所以在需要string对象的地方可以使用这两种字面值来替代。当把string对象和字符串字面值混在一起使用时必须保证 + 号的两侧运算对象至少有一个string对象 string s4 = s1 + ",__"; //正确 string s5 = "hello " + " aaaa"; //错误,没有string对象
今天在看COCOS2D的时候被源码中的一个宏定义难住了= =。。。找了半天资料~~~转自http://blog.sina.com.cn/s/blog_686188ef0100klku.html
#define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x
x##y表示什么?表示x连接y,举例说:
int n = Conn(123,456); 结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧
再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant :P
最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";
浙公网安备 33010602011771号