一、C++对C的扩展
1.C++的输入输出(cin,cout)
关于cin cout endl定义和使用
cin cout endl这些对象都是由C++提供定义的,我们在使用时,只需要将定义和声明
部分引用到自己工程即可。
extern ---- 外部声明,它告诉编译器,这个变量是在其他地方定义,这个地方告诉编译
器是一个外部声明
extern istream cin; /// Linked to standard input
extern ostream cout; /// Linked to standard output
它们被定义在std命名空间中
namespace std
{
extern istream cin;
extern ostream cout;
}
std及istream和ostream他们都间接引入#include <iostream>
所以在使用时,必须要包含该文件中,对于using namespace std;是可选的
2.C++字符串类型(string)
C++类型分为内置类型(C语言的类型,比如:int double)和类类型(使用关键字class定义的类型)
在C++中提供了一个类类型string,该数据类型主要用来处理字符串操作,可以替代C语言中char数组和字符指针(char*)。基本使用如下:
char* --- char char a[10]
string --- 字符串类型 ,string它是声明在命名空间std,所以要使用字符串,
要包括std和 #include <iostream>
//就将它看作int类型一样
string s1; //声明字符串类型变量
s1 = "hello"; //给字符串变量赋值
string s2 = "world"; //声明并且赋值
cout << "s1 = " << s1 << endl;
cout << "s2 = " << s2 << endl;
string s3 = s1; //使用变量去给另一变量初始化 strcpy
string s4 = s1 + s2; //两个字符串相加,得到 一个新的字符串,相当于字符串拼接
cout << "s4 = " << s4;
if(s1 == s3) //判断两个字符串是否相等
{
cout << "s1 和 s3两者相等"<<endl;
}
//以上是对字符串的基本操作,还以其他的操作:查找,删除,这些操作,
放在STL模板库中去使用
现场代码案例:
录入和输出一个学生信息,录入和输出都采用函数来进行封装
struct student
{
int age;
char sex;
//char name[20]; strcpy
// char* name; strcpy
string name;
};
补充:笔试题
void func(int a[100]) //数组作为函数形参,会自动退化为指针
{
sizeof(a) = ? //32 --- 4
}
//void logging_data(struct student p) //可以,但是,效率不高,不推荐使用
void logging_data(struct student* p) //结构做为形参,通常用指针,为了保证数据的传输效率
{
cout << "请录入学生名字:";
cin >> p->name;
cout << endl;
cout << "请录入学生年龄:";
cin >> p->age;
cout << endl;
cout << "请录入学生性别:";
cin >> p->sex;
cout << endl;
}
void print_data( struct student* p)
{
cout << "学生的信息如下:"<<endl;
cout << p->name << endl;
cout << p->age << endl;
cout << p->sex << endl;
}
3. C++布尔类型(bool)
布尔类型(bool)是C++中新增的一种基本数据类型。类似于C中的基本数据类型(比如:int)。该类型的值只有两种情况:true和flase,如果需要使用bool类型,直接使用即可。
true ---- 1
flase ---- 0
bool isok = true;
对于值的含义跟C语言保持一致,零为假,非零即真,但是值仍为1
4. C++枚举类型(enum)
C++ 枚举在使用上跟C语言中完全一样,不同的是,它才是真正意义上枚举类型,而C语言中的枚举类型本质上是一个整型常量。如下所示:
//定义一个游戏操作枚举类型
enum play{
LEFT, //LEFT = 0
RIGHT, //1
UP, //2
DOWN //3
};
//C++ 枚举才是真正的枚举类型,不是整型常量
// cannot initialize a variable of type 'enum play' with an
//rvalue of type 'int'
//enum play op = 2; c语言是OK
//C++中,要使用定义的常量给一个
enum play op = DOWN;
cout << op << endl;
5. C++命名空间(namespace)
1).命名空间引入分析
在实际的系统开发中,所有的开发工作,通常都不会仅由一个人来开发完成,不同的人只负责自己功能模块,他们在设计时,比如声明变量,通常情况下,不会考虑其他人是否已使用该变量名,在模块功能测试时,相互之间是独立的,完全没有问题,当系统功能合成 时,不可避免地会出现变量或函数的命名冲突,因为变量或函数重名而导致的问题将会造成一定的混乱。例如:
//模块一
int i;
//模块二
int i;
目的是为了解决命名冲突,引入歧义
2).命名空间(namespace)使用
基本语法:
namespace 命名空间名字
{
}
注意事项:在定义命名空间时,结束不要加分号,示例如下:
namespace model1
{
int i;//当前变量i只对命名空间model1可见,它的作用域被限定在model1
int j;
}
namesapce model2
{
int i;//当前变量i只对命名空间model2可见,它的作用域被限定在model2
}
由于使用命名空间后,变量的作用域被限定,所以在使用变量时,就需要通过特定方式来完成。需要用到“::”操作符,“::”操作符是域解析操作符。例如:
model1::i = 1;
model2::i = 2;
除了直接使用域解析操作符,还可以采用using声明(using declaration),例如:
using model1::i;
i= 0; //使用model1定义的变量i
model2::i= 10; //使用model2定义的变量i
using声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:
using namespace model1;
i= 0; //使用model1定义的变量i
j = 20;
model2::i= 10; //使用model2定义的变量i
命名空间成员使用方法总结:
1.方法一 :命名空间名::成员 比如:spaceA::a;
使用using 可以使得命名空间中的成员暴露外部 ,以致可以使用该成员
2.方法二: using 命名空间名::成员 ----> 把指定的成员暴露给外部
比如:using spaceA::a;
3.方法三: using namespace 命名空间名 ---> 将其所有成员暴露给外部
比如: using namespace spaceA;
3)命名空间嵌套
namespace 命名空间1
{
int a;
namespace 命名空间2
{
int a;
}
}