所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所 有标识符都被定义于一个名为std的namespace中。
一 :<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上, 在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件 里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,
1)当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;
2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须 使用namespace std;这样才能正确使用cout。
最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问 题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h> 和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"
namespace nA{} 不能定义在函数中 只能是全局变量
//当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命
//名空间,也就是早期的c++实现;
//当使用<iostream>的时候,该头文件没有定义全局命名空间,必须
//使用namespace std;这样才能正确使用cout。//C++定义变量随用随定义
//C中最好都定义在主函数开始位置//C++对全部变量的检测增强(不可重复定义)
//C语言中ok//C++中的struct是⼀个新类型的定义声明
//C语⾔的struct定义了⼀组变量的集合,C编译器并不认为这是⼀种新的类型
//如若没有typedef必须用struct进行变量声明
//C++中所有的变量和函数都必须有类型
//C语⾔中的默认类型int在C++中是不合法的
//C++更加强调类型,任意的程序元素都必须显示指明类型//C++在C语⾔的基本类型系统之上增加了bool
//C++中的bool可取的值只有true和false.理论上bool只占⽤⼀个字节
//true代表真值,编译器内部⽤1来表⽰ false代表⾮真值,编译器内部⽤0来表⽰
//bool类型只有true(⾮0)和false(0)两个值
//C++编译器会在赋值时将⾮0值转换为true,0值转换为false
//C语言中的三目运算符返回的是变量值,不能作为左值使用
//C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方,可以作为左值(a > b ? a : b )= 50; //正确,C++中的三目运算符可直接返回变量本身,可以作左值
//(a > b ? 10 : 20) = 50; 10和20是自变量,不能修改,没有内存地址//C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在
//const修饰的常量编译期间,就已经确定下来了
//C++中的const常量与宏定义不同
//const常量是由编译器处理的,提供类型检查和作用域检查
//宏定义由预处理器处理,单纯的文本替换
//c 语言中枚举本质就是整型, 枚举变量可以用任意整型赋值。而 c++中枚举
//变量, 只能用被枚举出来的元素初始化。
c语言.c 文件:
#include<stdio.h>
#if 1
void test01() {int a = 10;printf("%d\n", a);int b = 20;
}
int g_val; //分配到bss段
int g_val = 10;
void test02() {printf("%d\n", g_val);
}struct student1 {char name[64];int id;
};
typedef struct student2 {char name[64];int id;
};
typedef struct Student3 {char name[64];int id;
}student3;void test03() {struct student1 s1;//student2 s2; 错误student3 s3;
}f() {return 10;
}
void test04() {f(); //ok
}g(int a) {return a;
}
void test05() { g(10,20,30);//ok
}void test07() {int a = 10;int b = 20;int c = 0;//左值 右值//左值//右值c = a > b ? a : b;printf("%d\n", c);//(a > b ? a : b )= 50; 错误 (a > b ? a : b)返回的是一个具体数值//10=50; 错误*(a > b ? &a : &b) = 50; //(a > b ? &a : &b) 返回的是a的地址 *a间接操作a的地址printf("a=%d\n", a);printf("a=%p\n", a);}
void test08() {/*const int a;int const a; //等价,都表示a是一个常量 只读 不可修改 栈区const int *c;const int* c; //等价于(const int)*c;指针存放地址指向的内容不可以修改//指针指向可以修改int* const c; //等价于int(* const c); 指针指向是int,指针本身是const//指针指向不可以改变,但是指针存放地址指向的内容可以改变const int* const c; //指针指向不可以改变,指针存放地址指向的内容不可以改变*/const int a = 10; //a虽然用const修饰,但是变量//int array[a] = { 0 }; a是变量,所以报错int *p = &a;*p = 20;printf("%d", a); //20}enum season {Spring,Summer,Autumn,Winter1,Winter2,Winter3,Winter4,
};
void test09() {enum season s = Winter3;if (s == 5) {printf("%d", s); //5}s = Winter4;if (s == 64) {printf("%s", s);}
}
int main(void) {/*test01();test02();test03();test04();test05();test06();test07();test08();*/test09();return 0;
}
#endif
c++语言.cpp:
//当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命//名空间,也就是早期的c++实现;
//当使用<iostream>的时候,该头文件没有定义全局命名空间,必须//使用namespace std;这样才能正确使用cout。//C++定义变量随用随定义
//C中最好都定义在主函数开始位置//C++对全部变量的检测增强(不可重复定义)
//C语言中ok//C++中的struct是⼀个新类型的定义声明
//C语⾔的struct定义了⼀组变量的集合,C编译器并不认为这是⼀种新的类型//如若没有typedef必须用struct进行变量声明//C++中所有的变量和函数都必须有类型
//C语⾔中的默认类型int在C++中是不合法的
//C++更加强调类型,任意的程序元素都必须显示指明类型//C++在C语⾔的基本类型系统之上增加了bool
//C++中的bool可取的值只有true和false.理论上bool只占⽤⼀个字节
//true代表真值,编译器内部⽤1来表⽰ false代表⾮真值,编译器内部⽤0来表⽰
//bool类型只有true(⾮0)和false(0)两个值
//C++编译器会在赋值时将⾮0值转换为true,0值转换为false//C语言中的三目运算符返回的是变量值,不能作为左值使用
//C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方,可以作为左值//C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在
//const修饰的常量编译期间,就已经确定下来了
//C++中的const常量与宏定义不同
//const常量是由编译器处理的,提供类型检查和作用域检查
//宏定义由预处理器处理,单纯的文本替换//c 语言中枚举本质就是整型, 枚举变量可以用任意整型赋值。而 c++中枚举
//变量, 只能用被枚举出来的元素初始化。
#if 1
#include<iostream>
using namespace std;
void test01() {int i = 0;for (int i = 0; i < 10; i++){}int b = 20;cout << b << endl;
}
/*
int g_val;
int g_val = 10; 重复定义ERROR
void test02()
{cout << g_val << endl;
}
*/struct student
{char name[64];int id;
};void test03() {student s1;
}/*
f() { //没有返回类型 错误return 10;
}
void test04() {f();//没有返回类型 错误g(10,20); //报错
}*//*
g(int a) {return a;
}
void test05() {g(10, 20); //报错 缺少参数
}*/void test06() {bool flag = true;cout << flag << endl; //1flag = false;cout << flag << endl; //0flag = 3;cout << flag << endl; //1flag = -3;cout << flag << endl; //1cout<<"sizeof(flag):" << sizeof(flag) << endl;
}void test07() {int a = 10;int b = 20;int c = 0;//左值 右值//左值//右值cout << "a=" << a << endl; //10cout << "b=" << b << endl; //20c = a > b ? a : b;cout << c << endl; //20cout << "a=" << a << endl; //10cout << "b=" << b << endl; //20(a > b ? a : b )= 50; //正确,C++中的三目运算符可直接返回变量本身,可以作左值cout <<"a="<< a << endl; //10cout << "b="<<b << endl; //50
}void test08() {const int a = 10; //a是真正的常量int array[a] = { 0 }; //可以通过编译int *p = (int*)&a; //如果对常量取地址,编译器会临时开辟一个空间temp,指针指向temp*p = 20; //改变的时临时开辟的temp变量cout << "a=" << a << endl; //10cout << "*p=" << *p << endl; //20
}enum season {Spring,Summer,Autumn,Winter1,Winter2,Winter3,Winter4,
};
void test09() {enum season s = Spring;if(s==Spring)cout << s << endl; //0
}
int main() {//test06();//test07();//test08();test09();
}#endif