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

C++入门基础知识

2017-09-24 19:52 477 查看
C++98/03关键字

asm do if return typedef auto double inline short typeid bool dynamic_cast int signed typename break else long sizeof union case enum mutable static unsigned catch explicit namespace static_cast using char export new struct virtual class extem operator switch void const false private template volatile const_cast float protected this wchar_t continue for public throw while default friend register true delete gouto reinterpret_cast try

C++数据类型

基本数据类型(内置类型):字符型char、整型int、浮

点型float/double、逻辑型bool、无类型void

非基本数据类型(自定义类型):数组type[]、指针type*、结构体struct、联合体union、枚举enum、类class。

名字空间

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

#include<iostream>
using namespace std;//C++库

//名字空间域
namespace name1
{
int a = 0;
}
namespace name2
{
int a = 1;
}

int main()
{
cout << name2::a << endl;//::是作用域解析符
system("pause");
return 0;
}
//名字空间域解决全局命名冲突的问题。


C&C++输入输出对比

cout是标准输出流对象,<<是输出操作符;

cin是标准输入流对象,>>是输入操作符;

endl是换行操作符;

他们都属于C++标准库,所以都在std的名字空间里面

//C语言
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i2 = 1;
double d2 = 2.22;
printf("C type: int->%d,double->%f\n", i2, d2);
scanf("%d,%f", &i2, &d2);
printf("C type: int->%d,double->%f\n", i2, d2);
system("pause");
return 0;
}

//C++
#include<iostream>
using namespace std;
int main()
{
int i1 = 1;
double d1 = 2.22;
cout << "C++type:" << "int->" << i1 << " double->" << d1 << endl;
cout << "please input and double:";
cin >> i1 >> d1;//这里可以对i1和d1键盘输入值;
cout << "C++type:" << "int->" << i1 << " double->" << d1 << endl;
system("pause");
return 0;
}


函数重载

在同一作用域类,一组函数的函数名相同,参数列表不同(个数不同/类型不同),返回值可同可不同。

缺省参数

//全缺省参数:传参时可以全部都不传;也可以只传第一个参数;也可以所有参数都传;切记不能只传后面的而不传第一个,例Add1( ,1);

//半缺省参数:在省略参数时不能缺省右边的参数;传参时可以只传缺省的左边的参数;也可以两个参数都传;但不能只传后面的而不传第一个

#include<iostream>
using namespace std;

//全缺省参数
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, 1);//两个参数都传值
Add1(1);//值传第一个参数

Add2(2);//只传缺省的左边的参数
Add2(2, 2);//两个参数都传

cout << Add1() << endl;
cout << Add1(1, 1) << endl;
cout << Add1(1) << endl;
cout << Add2(2) << endl;
cout << Add2(2, 2) <<
b597
; endl;
}
int main()
{
Test();
system("pause");
return 0;
}


引用

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

定义的格式为:

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

引用的特点:

一个变量可以取多个别名;

引用必须初始化;

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

在这里举一个简单的例子:
#include<iostream>
using namespace std;

void TestReference1()
{
int a = 1;
int& b = a;
//验证b是a的别名,它们指向同一块儿地址
cout << "a:address->" << &a << endl;//008FF858
cout << "b:address->" << &b << endl;//008FF858

a = 2;
//改变a的值,b的值也跟着改变
cout << "a: " << a << endl;//2
cout << "b: " << b << endl;//2
b = 3;
//改变b的值,a的值也得到了改变
cout << "a: " << a << endl;//3
cout << "b: " << b << endl;//3
int& c = b;//再取一个变量c为b的别名,此时b,c都为a的别名
c = 4;
//改变c的值,则a, b的值都跟着改变
cout << "a: " << a << endl;//4
cout << "b: " << b << endl;//4
cout << "c: " << c << endl;//4
}

int main()
{
TestReference1();
system("pause");
return 0;
}


const引用

#include<iostream>
using namespace std;

void TestReference2()
{
int d1 = 4;
const int & d2 = d1;
d1 = 5; // d1改变 d2的值也会改变。
//d2 = 6; // 不能给常量(不能被修改的量)赋值
const int d3 = 1;//d3有const修饰时,它的别名也必须要有const修饰
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;
}

int main()
{
TestReference2();
system("pause");
return 0;
}


引用作为参数

【值传递】如果形参为非引用的传值方式,则生成局部零时变量接收实参的值

void Swap (int left, int right) // 函数里得到交换,而实参并没有交换
{
int temp = left;
left = right ;
right = temp ;
}


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


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;
}
void TestReference2 ()
{
int a = 1;
int b = 2;
cout<<"a:" <<a<< endl;
cout<<"b:" <<b<< endl;
Swap (a , b);
cout<<"a:" <<a<< endl;
cout<<"b:" <<b<< endl;
}


总结:引用传递的效率与指针传递的效率差不多,高于值传递的效率。

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

例:

void ReadBigData (const bigData& x)

{

int a = x. array[100];

}

传值做返回值&传引用做返回值

传值返回时,是将ret的值放到eax寄存器中;

传引用返回时,是取ret的地址到eax寄存器中。

结论:若要返回的是一个临时变量的值时,就不用引用;

如果返回对象出了当前的作用域依旧存在,最好使用引用返回,因为这样更高效。

引用和指针的区别和联系

引用必须在定义时就初始化,切之后不能再改变指向其他变量;指针变量的值可以改变。

引用必须指向有效变量;指针可以为空指针。

sizeof指针对象和引用对象不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

指针和引用自增(++)自减(–)的意义不一样。

相对而言,引用比指针更安全。

【所以在使用指针的时候一定要检查指针是否为空,指针所指的地址释放以后最好置0】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: