Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66033
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-27 15:04
个人简介

记录,分享

文章分类

全部博文(43)

文章存档

2017年(24)

2015年(1)

2014年(18)

我的朋友

分类: C/C++

2017-03-16 10:50:12

一、变量和基本类型
1.在双引号前加 L 表示宽字符串字面值。 在一行的末尾加 \ 可将此行和下一行当做同一行处理


2.变量的初始化:a.直接初始化 (int ival(1024) );b.复制初始化  (int ival = 1024) 
对于类类型,直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象(7.3.2节),然后使用复制构造函数将那个临时对象复制到正在创建的对象。

tip:(初始化与赋值的区别)初始化指创建变量并给它赋初值,赋值时擦出对象的当前值并用新值代替。

3.变量的初始化规则:

(1)内置类型变量:函数体外定义的变量都初始化成0,函数体内定义的内置类型变量不进行自动初始化。
(2)类类型变量的初始化:如果没有为变量提供初始化式,则编译器通过默认构造函数初始化对象。如果初始化式和默认构造函数都没有提供,不可能进行变量初始化。

4.变量的声明和定义:
定义用于为变量分配存储空间,还可以为变量指定初始值,而声明用于向编译器表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它们的类型和名字。可以通过使用extern声明变量而不定义它( extern int i; ),也可以在函数外部用extern初始化式定义变量 。 变量可以声明多次,而只能定义一次。任何在多个文件中使用的变量都需要由与定义分离的声明。

5.名字的作用域:
(1)定义在所有函数外的名字具有全局作用域,可以在程序中的任何地方访问。函数内的变量具有局部作用域。在for或者if等语句内部定义的变量具有语句作用域。
(2)另外,c++还有两种不同级别的作用域:类作用域和命名空间作用域

6.const限定符:
(1)因为const变量定义后就不能修改,所以定义时必须初始化
(2)与一般变量不同,在全局作用域声明的const对象是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。通过指定const变为extern,就可以在整个程序中访问const对象 (非const变量默认为extern)

7.引用:
  引用是它所绑定对象的别名,作用在引用上的所有操作都作用在绑定的对象上。使用TYPE &var;的形式声明引用。
(1)引用变量必须在定义时初始化,即不能将引用已经绑定的对象改为其他对象。
(2)引用赋值时右值必须为变量,不能是字面值常量。
(3)const引用是指向const对象的引用,普通的引用绑定到const对象是不合法的。非const引用只能绑定到与该引用同类型的对象,而const引用可以初始化为不同但相关类型的对象或者初始化为右值(字面值常量) P.52

8.class和struct关键字的区别:默认情况下,class的成员都为private,而struct的默认成员都为public

9.头文件:
(1)头文件一般包含类的定义、extern变量的声明和函数的声明。
(2)使用头文件的好处:保证所有文件使用给定实体的同一声明;当时声明需要修改时,只需要修改头文件
(3)头文件只可以定义:类、定义时初始化的const对象和inline函数,其他均为声明!如果const对象不是用常量表达式初始化,那么它就不应该在头文件中定义,相反,它应该像其他的变量一样,在一个源文件中定义并初始化,并在头文件中为它添加extern声明  P.59
(4)头文件保护符:

#ifndef XXX_H
#define XXX_H
//body

#endif


二、标准库类型

1.using声明:
使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字 , using namespace_name::name;
(1)一个using声明只能作用于一个命名空间成员,即每个名字都需要一个using声明
(2)避免在头文件中中使用using声明,应该使用完全限定名。因为使用#include包含文件时,头文件中的内容被复制到include的位置,使得包含该头文件的所有程序文件都有了同样的using声明,而不管它是否需要。


三、数组和指针

1.关于数组:
(1)一个数组不能用另一个数组初始化,也不能直接将一个数组变量赋值给另一个数组变量。
(2)数组下标的类型是size_t

2.关于指针:
(1)不能讲int型变量赋给指针变量,但可以将数值0或用0初始化的const常量赋给指针。如果要使用预处理器变量NULL,需要包含cstdlib头文件。
(2)不允许使用void*类型的指针操纵它锁指向的对象  P.104
(3)指针和引用的区别:a.引用定义时必须初始化;b.给引用赋值修改的绑定的对象,而给指针赋值修改的是指针的值。
(4)两个指针减法操作的结果是标准库类型ptrdiff_t。

3.指针和const限定符
(1)指向const对象的指针:const TYPE *ptr; 可以修改 ptr 的值,但不能修改ptr指向的对象的值。
把一个声明为const对象的地址赋给一个声明为非const对象的指针会引发编译错误。但是允许把非const对象的地址付给指向const对象的指针。
(2)const指针:TYPE *const  ptr ; 不能修改 ptr 的值,但可以修改 ptr 指向的对象的值。
(3)指向const对象的const指针:const TYPE *const  ptr ;
(4)指针和typedef:

[例子] typedef string *pstring; const pstring cstr;

cstr 是指向string类型对象的const指针,而不是指向string类型const对象的指针。因为const修饰的是pstring,而pstring是个指针,所以cstr是个const指针。typedef不是文本扩展,不能直接做文本替换来理解。

4.用new创建的动态数组ptr,需要用delete [] ptr; 来释放内存,不要忘记方括号。

四、表达式

1.隐式转换:
(1)指针转换
除了以下三种情况,数组都会自动转换为指向第一个元素的指针:a.数组用作 & 操作符的操作数;b.数组作为sizeof的操作数;c.用数组对数组的引用进行初始化。
指向任意类型的指针都可转换为void*类型;
整型数值常量0可以转换为任意指针类型。

[例,64位] long arr[5];
     size_t count1 = sizeof(arr); // 40
     long *p = arr;
     int count2 = sizeof(p); //8

(2)转换为bool型:如果指针或算数值为0,则可转换成bool值为false,否则为true

(3)枚举变量可转换成整型。

(4)由标准库类型定义的转换:如 while(cin>>s),隐式转换为bool。 P.157

2.显式转换

(1)dynamic_cast 

(2)const_cast : 去掉变量的const属性

【例子】 void func(char * s); ... ; const char * p = value; func(p); 
上面代码会引起编译错误,因为无法将const变量隐式转换成非const变量,在确保代码安全的前提下,可以使用 const_cast(p)进行强制转换。

(3)static_cast :所有编译器隐式执行的转换都可以用static_cast完成,它能消除编译器的警告信息。如果编译器不提供自动转换,可以使用它进行强制类型转换。
(4)reinterpret_cast : 为操作数的位模式提供较低层次的重新解释。 危险!!


说明:
1. 字面值常量"hello" 的类型为const char[6] 或 const char * ,而不是const string


阅读(436) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~