1、namespace命名空间
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,
标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
C中的命名空间
在C语言中只有一个全局作用域
C语言中所有的全局标识符共享同一个作用域
标识符之间可能发生冲突
C++中提出了命名空间的概念
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间
C++命名空间的定义:
namespace name { … }
C++命名空间的使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
默认情况下可以直接使用默 认命名空间中的所有标识符
/* #include<iostream>
#:预处理标志,后面跟预处理指令,include:预处理指令,包含 <iostream>:c++头文件,输入输出流
这行的作用就是在预编译之前先执行这行代码。系统提供的头文件用<>括起来
#include<iostream.h>
这个头文件是c标准的头文件,c++中叫非标准库文件。
using namespace std;使用标准命名空间。也就是说C++当中的标准库文件,函数,对象啊等都存放在std空间中,
作用:作用是在编写大程序的时候能够定义重复的变量,(标识符)
当需要调用标准空间中的对象,函数的时候调用方法:std::cout std::cin std::endl;需要加双冒号
#include<iostream> #include<iostream.h>的区别:
使用#include<iostream>的时候,需要使用using namespace std;而#include<iostream.h>不需要
*/
#include <iostream>
//using std::cout; //使用std空间中cout对象。::调用的意思
//using std::endl;
int main(void)
{
//cout<<"hello world"<<endl;
std::cout<<"hello world"<<std::endl;
return 0;
}
/*
#include<iostream>
using namespace std;
int main(void)
{
cout<<"hello world"<<endl;
return 0;
}
#include<iostream.h>
int main(void)
{
cout<<"hello world"<<endl;
return 0;
}
2、“实用性”增强
C语言中的变量都必须在作用域开始的位置定义!!
C++中更强调语言的实用性,所有的变量都可以在使用时再定义
#include "iostream"
using namespace std;
int main(void)
{
int a = 0;
cout << "yangyun" << endl;
int b = 0; //可以随时定义变量
cout << "lijiatu" << endl;
system("pause");
return 0;
}
3、register关键字的增强
register关键字请求编译器将变量直接存储在寄存器中,提高访问速度。
C语言中无法取得register变量的地址,C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
int main(void)
{
register int a = 2;
printf("a的地址是:%x\n", &a);
system("pause");
return 0;
}
4.变量检测增强
在C语言中重复定义多个同名的全局变量是合法的。
在C++中不允许定义多个同名的全局变量。
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址上。
int g_var;
int g_var = 1;
C++直接拒绝这种二义性的做法。
5、struct类型的加强
C语言的struct关键字定义一组变量的集合,C编译器并不会认为这是一种新的数据类型。
C++中的struct是一个新类型的定义声明。
struct Student {
char name[100];
int age;
};
int main(void)
{
Student S1 = {"yangyun", 20};
cout << "S1的年龄是" << S1.age << endl;
system("pause");
return 0;
}
6、C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的。
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
f(10);
printf("g() = %d\n", g(1, 2, 3, 4, 5));
getchar();
return 0;
}
上面的定义在C语言中可以通过,但在C++中不能通过
7、新增bool类型的关键字
C++中的bool类型可取的值只有true和false
理论上bool只占用一个字节,如果多个bool变量定义在一起,可能各占1个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
C++编译器会在赋值时将非0的值转换为true,将0值转化为false
8、三目运算符功能增强
1)C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
====>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
int main(void)
{
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
cout << a << endl;
system("pause");
return 0;
}
输出为30
9、C/C++中的const
const基础知识
const int a; // 常整形数
int const b; // 常整形数
const int * c; //指向常整型的指针,指针所指向的内存数据不能被修改,指针本身可以修改
int *const d; //常指针,指针变量不能修改,只想的内存空间的值可以修改
const int *const e; // 一个指向常整形的常指针,都不能被修改
const关键字定义常量,意味着只读。
Const好处
合理的利用const,
1指针做函数参数,可以有效的提高代码可读性,减少bug;
2清楚的分清参数的输入和输出特性
C中“冒牌货”
int main()
{
const int a = 10;
int *p = (int*)&a;
printf("a===>%d\n", a);
*p = 11;
printf("a===>%d\n", a);
printf("Hello......\n");
return 0;
}
C++编译器对const常量的处理
当碰见常量声明时,在符号表中放入常量 =问题:那有如何解释取地址
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)
注意:
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
结论:
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址
当const int &a = 10; const修饰引用时,也会分配存储空间
C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了
10、const和#define的区别
对比加深
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换