目录:
- 命名空间.
- C++基本的输入输出流.
- 函数重载.
- C++缺省参数.
- 指针和引用.
命名空间:
- 命名空间的定义:
命名空间的定义是由 namespace关键字开始,后接命名空间名字 name,并在一对花括号中定义成员的。命名空间可以在全局域或其它域中定义( 类和函数内部除外 ),但命名空间的名字在所定义域中是唯一的,并且命名空间与类和结构体不同不以‘;’结尾。例如:
namespace name
{
int age;
class test
{
public:
test()
{}
private:
int _a;
};
}
2.命名空间的使用:
3.多文件组织命名空间:不同命名空间的成员可以具有相同的名字,但在同一命名空间中成员名不允许冲突,命名空间中的成员之间可以相互访问,在命名空间外必须使用 :‘命名空间名+::( 作用域解析符 )+成员名 ’格式访问命名空间中的成员。例如:
name::age = 1;
每次都要加上命名空间名和::
符号很不方便,因此我们可以使用using
关键字using name::age;
定义,在此之后可以直接使用age
,即在此之后age = 1;
等价于name::age = 1;
命名空间的定义可以在同一文件的不同部分,也可在不同文件中,即:命名空间的定义具有累加效应。同时,我们也可以像函数的声明与定义一样,将命名空间的成名声明放在单独的文件中,而将命名空间成员的定义放在另外的文件中,需要使用时包含具有声明的源文件即可。例如:
//namespace.h
#include<iostream>
namespace test
{
void add(int a, int b);
}
//namespace.cpp
namespace test
{
void add(int a, int b)
{
std::cout << "haha" << std::endl;
}
}
命名空间成员的定义可以放在命名空间外定义,但必须指定名空间的名字,其格式如下;
void test::add(int a, int b)
{
std::cout << "haha" << std::endl;
}
4.全局命名空间:
全局命名空间就是程序中函数、类、其它命名空间之外的全局作用域,全局命名空间是隐式声明的,全局命名空间的成员访问格式如下:
::MemberName
.
c++的基本输入输出流:
c和c++并没有为输入输出提供专门的语句,在c中输入输出是由
scanf();
和printf();
库函数实现的,而在c++中输入输出是通过‘流’的方式实现的,但是,输入输出是由编译系统的I/O库定义的并不是c++本身定义的。有关‘流’的定义(cout 、cin 、<< 、>>等
)是放在iostream
文件中的,所以,在程序中使用使用输入输出时应用#include<iostream>
指令将文件iostream
包含进程序中。尽管c++并没有定义输入输出语句,但在不混淆的情况下,为了叙述方便,常把由cout、<<和cin、>>
组成的输入输出称为输入输出语句;c++输入输出通过‘流’方式的实现如下图所示:
在定义流对象时,系统会在内存中开辟一段缓冲区用来暂存输入输出流数据,在执行cout
语句时一般先将插入的数据放在缓冲区中,直到缓冲区满或者遇到endl
为止,此时将缓冲区中的数据输出并清空缓冲区。
cout
语句输出格式如下:
cout<<变量1<<变量2<<变量n<<endl;
不能使用一个插入操作符插入多个变量,n个变量应使用n个插入操作符进行插入。在输入输出语句中如没有特殊要求不需要指明数据的类型,系统会自动识别数据的类型,在使用cin
语句时空白字符会被跳过,如要输入空白字符可使用getchar()
获得。
函数重载:
在c++中是支持函数重载的,所谓函数重载是指:在同一作用域内,一组函数的函数名相同,参数列表不同(参数个数/参数类型,
(int,char)/(char,int)
为不同类型),返回值可以相同也可以不同。为什么c++会支持重在呢?因为在c++程序编译时编译器会对函数名进行修饰,修饰规则为:_Z
+函数字符数
+函数名
+每个参数首字母
。例如:test(int x,char y);
经过编译器修饰后函数名变为_Z4testic
,经过修饰后重载的每个函数函数名是唯一的,所以c++支持函数重载。
C++缺省参数:
c++支持函数缺省参数,一般是在函数声明中定义缺省参数,也可以在函数实现时定义缺省参数,但是,编译器不允许在声明和实现中同时定义默认参数,因为这种定义是灾难性的。将默认参数定义在声明中的好处在于:
- 在类中声明成员函数时定义默认参数,比较方便用户查看。
- 非类函数在声明中定义默认参数的好处在于用户可以利用声明方便修改默认参数。
注:
c++标准规定:声明默认参数时只可从右到左依次声明默认参数且中间不可有断接,其中全部参数为默认参数的函数称为全缺省参数函数,部分参数为默认参数的函数称为半缺省参数函数。例如:
#include<iostream>
using namespace std;
//全缺省参数
void test1(int x = 0,int y = 0)
{
cout << "一个参数" << endl;
}
//半缺省参数
void test2(int x,int y = 0)
{
cout << "两个参数" << endl;
}
int main()
{
test1();
test2(1);
return 0;
}
指针和引用 :
- 概念:
- 指针:
指针是指一块内存空间的地址,根据指针所指向的这块内存空间的类型不同,指针可分为int *
、char *
、float *
等类型。
- 引用:
引用是一个变量的别名,一个变量的别名同样标记此变量所对应的内存空间。 - 使用方法:
- 指针使用方法:
int a = 10;
int *pa = &a;//pa里存储了a的地址,即pa指向a;
-引用使用方法:
int b = 20;
int& c = b;//并没有创建变量,c是b的别名;
- 做参数、做返回值的作用:
- 指针作用:
指针做参数和做返回值时传递给函数和从函数返回的是变量的地址。
- 引用作用:
引用做参数和做返回值时传递给函数和从函数返回的是变量本身,当引用做函数的返回值时应特别注意应返回出了函数作用域变量仍然存的变量引用,若返回局部变量引用将出现很多麻烦! - 区别和联系:
- 引用只能在定义时初始化,之后将不能改变成其他变量的引用,指针变量的值可以改变.
- 引用必须指向有效的变量,指针可以为空.
- sizeof指针对象和引用对象意义不一样,sizeof引用对象得到的是所指向变量的大小。sizeof指针对象得到的是所指向变量的地址大小.
- 指针和引用自增(++)自减(–)意义不一样.
- 相对而言引用较指针更安全
总结:
指针比引用更加灵活,同时指针也更加危险,在使用指针时,应先判断指针是否为空,指针所指向的地址释放后应将指针置为空,避免出现野指针。