您的位置:首页 > 编程语言 > C语言/C++

C++入门基础知识

2017-10-16 21:46 465 查看
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::cin;
using 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++中函数名与参数类型、参数个数有关。

//_Z12OverloadFuncid
void OverloadFunc(int x,double d)
{}
//_Z12OverloadFuncdi
void OverloadFunc(double x,int d)
{}


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)概念:

引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。

2) 使用方法:

使用方法:

定义的格式为:

类型&引用变量名=已定义过的变量名;

引用的特点:

1> 一个变量可取多个别名

2>引用必须初始化

3>引用只能在初始化的时候引用一次,不能改变为其他的变量。

注:引用必须用与该引用同类型的对象初始化。

const引用:

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

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


不能直接对ival再赋值,故不能通过使用refval来修改ival。由于ref2是非const引用,故用ival初始化ref2不合法。权限只可缩小,不可放大。

注:

1>非const引用只能绑定到与该引用同类型的对象。

2.>const引用则可以绑定到不同类型的对象或绑定到右值。

例:

//对于非const是不合法的:

int i=42;
const int &r=42;
const int &r2=r+i;


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


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

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


3. 做参数和返回值的作用:

作为参数:

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

void Swap(int left,int right)
{
int tem=left;
left=right;
right=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,否则可能存在野指针问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: