C++入门基础知识

来源:互联网 发布:kyocera打印机驱动mac 编辑:程序博客网 时间:2024/06/05 08:18

1.命名空间
名字空间域是随C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:

namespace name1{    int a=0;}namespace name2{    int a=1;}name1::a=3;name2::a=4

作用:名字空间域解决全局命名冲突的问题。
标准C++库中的所有组件都是在一个被称为std的命名空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符:
using namespace std;
就可以直接使用标准C++库成员中的所有成员。
或者std::成员 的方式也可以使用C++库里的所有成员。
::是作用域解析符
namespace std//std是C++标准库的名字空间
{
//标准库成员
}
注:
1) 一个using声明一次只能作用于一个命名空间成员。using声明可用来明确指定在程序中用到的名命空间中的名字,如果希望使用std中的几个名字,则必须要为每个名字都提供一个using声明。

using std::cinusing std::cout;int main(){   int a,b;   cin>>a>>b;   cout<<"a+b="<<a+b;   return 0; }

//对cin、cout进行using声明,则在后文就可以省去前缀std::,直接使用命名空间中的名字,代码可读性更高。
2) 在头文件中,总是使用完全限定的标准库名字。(即:不要使用声明形式例如:using std::cin,而是在代码中使用std::cin。)

2.C++基本的输入输出流(简单介绍一下就行)**
cout是标准输出流对象,<<是输出操作符;
cin是标准输入流对象,>>是输入操作符;
endl是换行操作符;
以上三个都属于C++标准库,都在std命名空间里。
3.重载(C++为什么支持重载?)**
在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可同可不同。
支持重载原因:C++中函数名的修饰规则。C++中函数名与参数类型、参数个数有关。

//_Z12OverloadFuncidvoid OverloadFunc(int x,double d){}//_Z12OverloadFuncdivoid OverloadFunc(double x,int d){}

4.C++缺省参数
缺省分为全缺省和半缺省;

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

注:缺省参数使用主要规则:调用该函数时,如果要省略一个参数,必须省略后面的参数,即:带缺省值的参数必须放在参数表的最后面。缺省值必须是常量。
一旦为函数的某个参数指定了缺省值,则必须为后续参数也定义缺省值,从右向左定义缺省参数。
调用函数时,如果省去一个参数传递,则略去后续所有参数传递,调用时将参数从左向右,逐一传递给形参。

5.指针和引用(概念、使用方法、做参数、做返回值的作用,指针和引用的区别)**
1)概念:
引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。
2) 使用方法:
使用方法:
定义的格式为:
类型&引用变量名=已定义过的变量名;
引用的特点:
1> 一个变量可取多个别名
2>引用必须初始化
3>引用只能在初始化的时候引用一次,不能改变为其他的变量。
注:引用必须用与该引用同类型的对象初始化。

const引用:
const引用是指向const对象的引用:

const int ival=1024const int &refval=ival;//okint &ref2=ival;//error

不能直接对ival再赋值,故不能通过使用refval来修改ival。由于ref2是非const引用,故用ival初始化ref2不合法。权限只可缩小,不可放大。
注:
1>非const引用只能绑定到与该引用同类型的对象。
2.>const引用则可以绑定到不同类型的对象或绑定到右值。
例:
//对于非const是不合法的:

int i=42const int &r=42const int &r2=r+i;
double dval=3.14const int &ri=dval;

上面代码编译器会转换为:

double dval=3.14int temp=dval;const int &ri=temp;

3. 做参数和返回值的作用:
作为参数:
1)【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值。例:如下代码不能实现其功能。

void Swap(int left,int right){    int tem=leftleft=rightright=temp;}

2)【引用传递】如果形参为引用类型,则形参是实参的别名。


void Swap(int& left,int& right)
{
int tem=left;
left=right;
right=temp;
}
3)【指针传递】

void Swap(int* pleft,int* pright){    int tem=*pleft*pleft=*pright*pright=temp;}

注:当不希望函数内改变参数的值时,尽量使用常引用传参。

void RedBigData(const bigdata& x){  int a=x.array[100];}

引用传递时的效率:

struct BigData{    int array[1000];};void DealBigData(BigData& x){    x.array[0] = 0;    x.array[1] = 1;    x.array[2] = 2;}#include<Windows.h>void TestReference3(){    BigData bd;    int begin = GetTickCount();    for (int i = 0; i < 1000000; ++i)    {        DealBigData(bd);    }    int end = GetTickCount();    cout<< "cost time:" << end - begin << endl;}

这里写图片描述

作为返回值:
1)不要返回一个临时变量的引用;
2)如何过返回对象出了当前的函数作用域还存在,最好使用引用返回,这样更高效。
int Add(int a,int b)
反汇编是: mov eax,dword ptr [ret]
传值返回是将ret的值放入eax中
int& Add2(int a,int b)
反汇编是: lea eax,[ret]
引用返回是将ret加载到eax
指针和引用的区别:
1 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
2 引用必须指向有效的变量,指针可以为空。
3 sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4 指针和引用自增(++)自减(–)意义不一样。
5 相对而言,引用比指针更安全。
总结:指针比引用更灵活,但也更危险。使用指针时一定要检查指针是否为空。指针所指的地址释放后最好置为NULL,否则可能存在野指针问题。