命名空间
using namespace 引入整个命名空间
namespace 表示命名空间的关键字类型; 不同命名空间中的值不同;
- namespace A{a =10;}
- namespace B{
- a = 20;
- }
std 表示 iostream 里的一个命名空间; 如果想使用 cout,endl 这些标准输出, 一定要引入 std 命名空间;
示例程序如图所示
- #include <iostream>
- namespace A
- {
- int a = 10;
- }
- namespace B
- {
- int a = 20;
- namespace C
- {
- struct person
- {
- char name[20];
- int age;
- };
- }
- }
- int main(void)
- {
- std::cout<<"A::a ="<<A::a<<std::endl;
- std::cout<<"B::a ="<<B::a<<std::endl;
- B::C::person p1 = {
- "wang2",
- 20
- };
- std::cout<<"B::C::p1.age ="<<p1.age<<std::endl;
- return 0;
- }
运行结果如图所示
面向行的输入: cin.getline();
getline()函数将读取整行, 它通过使用通过回车键输入的换行符来确认输入结尾. 其第一个参数用来存储输入行数组的名称, 第二个参数是要读取的字符数.
getline()会将换行符替换成空字符.
面向行的输入: cin.get();
get()函数的参数与 getline()一致, 不同的是, get()读到行尾时遇到换行符时便不再读取, 并且把换行符留在队列中, 因此第二次读取时遇到的第一个字符便是换行符, 此时 get 认为已读到行尾, 而没有发现可读取的内容, 利用不带参数的 get()可以读取下一字符(即使是换行符)
解决办法有如下:
- cin.get(name,SIZE);
- cin.get();
- cin.get(another,SIZE);
或
- cin.get(name,SIZE).get();
- cin.get(another,SIZE).get();
cin.getline(name,size).getline(name2,size); 将连续读取两行;
cin 读取输入时同样也会将换行符留在队列中, 导致下一次读取输入无法进行,(cin>>xx).get()可以很好地解决这个问题;
小结
cin>>xx: 接受一个字符串, 遇 "空格","TAB","回车" 都结束;
cin.get(字符变量名): 用来接受字符; 即使时空格也会接收; 返回一个对象, 而不是读取的字符
cin.get(字符数组名, 接受字符数目): 接收字符串, 可以接收空格, 会把换行符留在队列中;
cin.getline(字符数组名, 接受字符数目): 可以接收空格, 遇换行符结束, 并把换行符换成空字符;
getline(cin, 字符串名): 需包含 cstring 头文件, 可以接收空格;
C++ 对语言的增强
C++ 中定义结构体变量时可以不使用 struct 关键字;
对函数传参的检验能力更严格, 以及对函数返回值进行严格检查;
C++ 在 C 语? 的基本类型系统之上增加了 bool,C++ 中的 bool 可取的值只有 true(1)和 false(0), C++ 编译器会在赋值时将? 0 值转换为 true, 0 值转换为 false, 只占一个字节;
不管给 bool 类型负任何非零值, 其值都为 1;
对三目运算符的增强
- int a = 10;
- int b = 20;
- (a < b? a:b) = 30;// 此处取的是 a 的地址, 等价于 C 语言中
- *(a<b?&a,&b) = 30;
三目运算符作为左值, 那么返回值不能有常量;
对 const 增强
C 语言中可以通过指针的间接赋值改变所谓的 const 变量; 而 C++ 中不能通过指针间接改变 const 变量的值
在 C++ 中 const 修饰的常量必须初始化;
当对 const 常量取地址时, 会临时在栈上开辟一个临时空间, 这个变量是匿名的, 将匿名的地址赋给指针 p; 但 * p 改变的是临时的变量, 并不能改变 const 常量
C 语言中的 const 并不合适一个常量, 是一个变量加了只读属性而已; 而 C++ 中的 const 是个真正的常量;
const 和 #define 的区别:
define 和 const 变量在编译的阶段不一样, define 是预处理器, const 是编译器;
define 没有区域的区分, 而 const 完全符合编译器的逻辑判断, 有作用区域划分;
对枚举的增强
C 语言对枚举的赋值, 可以通过枚举的值, 直接赋值;
C++ 字符串的输入使用 getline(cin,str);
共用体 (union) 是一种数据格式, 能够存储不同的数据类型, 但只能同时存储其中的一种类型的值, 因此公用体的长度为其最大成员长度. 可以节省空间.
枚举(enum)
enum ok {red,yellow,boy,girl}; 作为枚举常量, 他们对应的值为 0~3;
只能将定义枚举时使用的枚举量赋值给枚举变量, 枚举量是整型, 可以提升为 int 型, 但 int 型不能自动转换为枚举类型;
- enum student{SPR,SUM,AUT,WIN};
- student s = SPR;
- s = 1;// 报错 C++ 中不允许, 而 C 语言允许
- s = WIN;// 必须通过枚举变量赋值;
- enum ok {red,yellow=9,boy=20,girl}
red 在默认情况下为 0, 后面没有初始化的枚举量将比前面的枚举量大 1. 因此 girl 的值 21;
每个枚举都有取值范围, 通过强制类型转换, 可以将取值范围中的任一个整数值赋给这个变量, 即使这个值不是枚举值.
C++ 中的引用
- //C++ 提供了另一种对变量的间接操作, 就是使用引用
- int a = 10;
- int *p = &a;
- int &b = a;// 定义了一个引用 b 指向 a,b 此时就是变量 a 的别名;
- b = 40;// 此时 a 的值也变成了 40;
- a = 30;// 此时 b 的值也变成了 30;
规则
1 引用没有定义, 是一种关系型声明. 声明它和原有某一变量 (实体) 的关系. 故 而类型与原类型保持一致, 且不分配内存. 与被引用的变量有相同的地址.
2 声明引用的时候必须初始化, 一经声明, 不可变更.
3 可对引用, 再次引用. 多次引用的结果, 是某一变量具有多个别名.
4 & 符号前有数据类型时, 是引用. 其它皆为取地址.
来源: http://www.bubuko.com/infodetail-2714439.html