CPP入门基础知识

来源:互联网 发布:bilibili mac 编辑:程序博客网 时间:2024/06/05 04:32

一.命名空间
1.命名空间的定义
命名空间的名字在其所在作用域中是唯一的,命名空间可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义,命名空间作用域不能以分号结束。
(1)每个命名空间都是一个作用域
命名空间中的每个名字必须引用该命名空间中的唯一实体,命名空间中的实体称为命名空间的成员,不同命名空间的成员可以具有相同的名字。
命名空间内部各成员之间可以直接访问,外部的代码必须指出所引用成员名字定义在哪个命名空间中。namespace 关键字使得我们可以通过创建作用范围来对全局命名空间进行分隔。本质上来讲,一个命名空间就定义了一个范围。名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局 域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它 起一个名字:
namespace A1
{
int a=10;
}
namespace A2
{
int b=10;
}

(2)从命名空间外部使用命名空间成员:

使用限定名namespace_name::member_name
使用这种方法引用成员可能有些麻烦,可以使用using声明
using cpp_primer::Query;

在此声明之后,程序无需使用cpp_primer限定符,可直接使用成员名字Query。

(3)名字空间域解决全局命名冲突的问题.
标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在 采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符: using namespace std; 就可以直接使用标准C++库中的所有成员。 或者 std::成员 的方式也可以使用C++库里的成员。

#include <iostream> using namespace std; main() {      std::cout<<"hello world"<<std::endl;   return0; }

(4)命名空间定义可以是不连续的

与其他作用域不同,命名空间可以在不同的部分定义,命名空间由这些分离的定义部分组成,从这点来看,命名空间的定义是可以累积的。

命名空间可以分散在不同的文件中,在不同的文件中的命名空间定义也是累积的。

由于名字只在声明名字的文件中可见,在这一规定的限制下,如果命名空间的一部分需要定义在另外的文件中,那么被定义部分的名字依然要再次声明。

也就是说,如果该成员之前不存在,那就新增该成员及定义;如果该成员已经在其他文件中声明,那么在此处只是由于要定义所以再次出现了声明。

2.C++基本的输入输出流(简单介绍一下就行)

cout是标准输出流对象,<< 是输出操作符;
cin是标准输入流对象,>>是输入操作符;
endl是换行操作符;
#include <iostream>
using namespace std;
int main ()
{
double d1 = 2.22;
cout<<"c++ type:" <<"int->"<< i1<<" double->"<< d1<<endl ;
cout<<"please input int and double:" ;
cin>>i1 >>d1;
cout<<"c++ type:" <<"int->"<< i1<<" double->"<< d1<<endl ;
}

3.重载(C++为什么支持重载?)
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,返回值没有特殊要求,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

4.C++缺省参数
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。
缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数。

//全缺省参数int Add1 (int a = 0, int b = 0) {     return a + b;  }//半缺省参数int Add2 (int a, int b = 0){return a+b; } void Test () {     Add1();     Add1(1);     Add1(1,1);    Add2(2);     Add2(2,2); }

5.指针和引用(概念、使用方法、做参数、做返回值的作用,指针和引用的区别)
(1)引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
指针是一个指向一个内存单元的地址

int a=1;int*p=a;intb=1int&b=a;

(2)对于引用 :一个变量可取多个别名 ,引用必须初始化 ,引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。而对于指针,存在多级指针并且指针可以为空
定义的格式为: 类型 &引用变量名 = 已定义过的变量名;
引用的特点:
一个变量可取多个别名 引用必须初始化 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。

void TestReference1 () {     int a = 1;     int& b = a;cout<<"a:address->" <<&a<< endl;    cout<<"b:address->" <<&b<< endl;a = 2;     b = 3;     int& c = b;  // 引用一个引用变量,别名的别名     c = 4; }

上述代码中a,b,c三个变量是一样的,地址也是相同的。

//const引用void TestReference2 () {     int d1 = 4;     const int & d2 = d1;     d1 = 5;          // d1改变 d2的值也会改变。     //d2 = 6;        // 不能给常量(不能被修改的量)赋值 const int d3 = 1;       const int & d4 = d3;  //int&d5 = d3;      const int & d6 = 5;  // 常量具有常性,只有常引用可以引用常量double d7 = 1.1;     //int& d8 = d7; //d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量                     // 也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。     const int& d9 = d7;   }
//引用作为参数【引用传递】如果形参为引用类型,则形参是实参的别名。 void Swap (int& left, int& right) {  int temp = left;  right=left;    left=temp;}【指针传递】 void Swap (int* pLeft, int* pRight)  int temp = *pLeft;     *pleft=*pright;  *pRight = temp; 
//传引用作为返回值int& Add (int d1, int d2) {      int ret = d1 + d2;      return ret ; }传值作为返回值int Add (int a, int b) {     return a + b;  }//传值返回时,是将ret的值放到寄存器中;传引用返回时,是将ret的地址放到寄存器中

(3)引用和指针的区别和联系(注意笔试的时候非常喜欢考这个知识点)
引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
引用必须指向有效的变量,指针可以为空。
sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
指针和引用自增(++)自减(–)意义不一样。
相对而言,引用比指针更安全。

原创粉丝点击