C++命名空间(名字空间):
为了解决合作开发时的命名冲突问题,C++ 引入了命名空间(Namespace)的概念
#include <stdio.h>
//将类定义在命名空间中
namespace Diy{
FILE fp = NULL;
class Student{
public:
char *name;
int age;
float score;
public:
void say(){
printf("%s的年龄是 %d,成绩是 %f
", name, age, score);
}
};
}
int main(){
Diy::Student stu1;
stu1.name = "小明";
stu1.age = 15;
stu1.score = 92.5f;
stu1.say();
return 0;
}
::
为域解析操作符
C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std
。std 是 standard 的缩写,意思是“标准命名空间”。
保留原来的库和头文件,C++ 中可继续使用,再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库,使用了老式 C++ 的程序可继续用原来的库,新开发的程序可以使用新版的 C++ 库。
老式 C++ --> 规范C++
iostream.h
-->iostream
,fstream.h
-->fstream
而对于原来C语言的头文件,采用同样的方法的基础上,每个名字前添加一个c
字母
``stdio.h-->
cstdio,
stdlib.h-->
cstdlib`
用新的库文件都可用为std
的 namespace
在 main() 函数中声明命名空间 std,它的作用范围就位于 main() 函数内部,如果在其他函数中又用到了 std,就需要重新声明
#include <iostream>
void func(){
//必须重新声明
using namespace std;
cout<<"http://c.biancheng.net"<<endl;
}
int main(){
//声明命名空间std
using namespace std;
cout<<"C语言中文网"<<endl;
func();
return 0;
}
作用全局范围,放于函数体外部
#include <iostream>
//声明命名空间std
using namespace std;
void func(){}
int main(){
return 0;
}
C++输入输出
编写 C++ 程序时,需要使用输入输出,则需要包含头文件iostream
,它包含了用于输入输出的对象,常见的cin
表示标准输入、cout
表示标准输出、cerr
表示标准错误.
iostream
是 Input Output Stream 的缩写,意思是“输入输出流”
#include<iostream>
using namespace std;
int main(){
int x;float y;
cout<<"Please input an int number:"<<endl;
cin>>x;
cout<<"The int number is x= "<<x<<endl;
cout<<"Please input a float number:"<<endl;
cin>>y;
cout<<"The float number is y= "<<y<<endl;
return 0;
}
cout
进行输出时需要紧跟<<
运算符,使用 cin
进行输入时需要紧跟>>
运算符,这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanf
和 printf
那样给出格式控制字符串.
cout
和 cin
都是 C++ 的内置对象,而不是关键字,在C++ 提前创建好的对象称为内置对象中.
endl
最后一个字符是字母“l”,而非阿拉伯数字“1”,它是“end of line”的缩写
C++布尔类型
在C语言中,关系运算和逻辑运算的结果有两种,真和假:0 表示假,非 0 表示真.(没有彻底从语法上支持“真”和“假”)
C++ 新增了 bool
类型(布尔类型),是 C++ 中的关键字(用法和 int
、char
、long
是一样的),它一般占用 1 个字节长度。bool
类型只有两个取值,true
和 false
:true
表示“真”,false
表示“假”.
bool flag = true;
C++ new和delete运算符
在C语言中,动态分配内存用 malloc()
函数,释放内存用 free()
函数。(C++中,这两个函数仍可使用) 如下所示:
int *p = (int*) malloc( sizeof(int) * 10 ); //分配10个int型的内存空间
free(p); //释放内存
C++新增两个关键字,new
和 delete
:
new
用来动态分配内存,delete
用来释放内存。
int *p = new int; //分配1个int型的内存空间
delete p; //释放内存
分配一组连续的内存以存储数据,用new[]
:
int *p = new int[10]; //分配10个int型的内存空间
delete[] p;
new
也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 new
和 delete
、new[]
和 delete[]
操作符应该成对出现,并且不要和C语言中 malloc()
、free()
一起混用.
C++ inline内联函数
函数调用是有时间和空间开销的, 若函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销不容忽视。
为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。
指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。
#include <iostream>
using namespace std;
//内联函数,交换两个数的值
inline void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int m, n;
cin>>m>>n;
cout<<m<<", "<<n<<endl;
swap(&m, &n);
cout<<m<<", "<<n<<endl;
return 0;
}
C++函数重载
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序, 只要有一个不同就叫做参数列表不同
#include <iostream>
using namespace std;
//交换 int 变量的值
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
//交换 float 变量的值
void Swap(float *a, float *b){
float temp = *a;
*a = *b;
*b = temp;
}
//交换 char 变量的值
void Swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}
//交换 bool 变量的值
void Swap(bool *a, bool *b){
char temp = *a;
*a = *b;
*b = temp;
}
函数的重载的规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。