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";

posted on 2013-10-18 17:38  泰达  阅读(158)  评论(0)    收藏  举报

导航