c++初识

来源:互联网 发布:java去掉括号内容 编辑:程序博客网 时间:2024/06/08 05:53

1.命名空间 :

指的是用花括号把一部分文件括起来,并用namespace开头起一个名字:

#include <iostream>//输入输出流using namespace std;///库的所有组件都在std中声明和定义////名字空间:namespace开头起一个名字namespace my{int a = 0;}namespace you{int a = 1;}int main(){my::a = 1;you::a = 2;cout<<my::a<<endl;cout<<you::a<<endl;return 0;}



就像上面的例子一样,在my和you里分别定义了两个a,但它们并不冲突,属于不同的命名空间。

::是作用域解析符。

using namespace std;   库的所有组件都在std中声明和定义,举个例子,输出"hello world"

using namespace std;///库的所有组件都在std中声明和定义int main(){cout<<"hello world"<<endl;return 0;}

cout,endl(换行)就是在std中声明和定义,如果没有using namespace std;这句代码,输入的那句就要改为:

std::cout<<"hello world"<<std::endl;

有时候使用std也有缺陷:

using namespace std;int cout = 1;int main(){std::cout<<"hello world"<<std::endl;std::cout<<cout<<std::endl;}

这句代码中,cout不明确,如果去掉std:

int cout = 1;int main(){std::cout<<"hello world"<<std::endl;std::cout<<cout<<std::endl;}
那么一个cout是库里的,一个是定义的,程序就不会出错。

2.C++基本的输入输出流

cout:标准输入流对象,<<输出操作符
cin:标准输入流对象,>>是输入操作符
endl:换行

int main(){int a = 0;double b = 0.0;cin>>a;cin>>b;cout<<a<<endl;cout<<b<<endl;//自动识别类型return 0;}

3.重载是什么?,C++为什么支持重载?

简单的说:重载就是在同一作用域内,函数的函数名名可以相同,单数参数的个数或者类型不同,返回值是什么都可以。举个例子:

void fun1(int a,int b)  //Z4fun1ii{cout<<a<<endl;cout<<b<<endl;cout<<endl;}void fun1(int a)  //Z4funi{cout<<a<<endl;cout<<endl;}int main(){fun1(5);fun1(1,2);}
这个程序是是没有出错的。

查看汇编代码,其实函数名并不是fun1,而是


Z4fun1ii 和 Z4fun1i

那么经过研究,函数名其实是:

Z+函数名有几个字母+函数名+参数类型的首字母


4.C++缺省参数

全缺

int ADD(int a = 10,int b = 20)//不传参{return a+b;}int main(){cout<<ADD()<<endl;//不传参cout<<ADD(30)<<endl;//传一个,第二个默认return 0;}


半缺:


int ADD(int a,int b = 20) // 只能从右往左缺省{return a+b;}int main(){cout<<ADD(30)<<endl;return 0;}

5.指针和引用:

引用:就是给已定义的变量取个别名,类型名&引用变量名 = 已定义过的变量名

注:一个变量名可取多个别名

       引用必须初始化

引用只能初始化一次,引用之后不能再指向其他变量


int main(){int a = 10;int& b = a; //b是a的引用(别名),它们指向相同a = 20;b = 30;}

通过监视,可以看出a改变那么b也改变,b改变那么a也改变


const引用和类型不同的引用:

int main(){//1.const int a = 10;//int& b = a;//错const int& b = a; //a的别名,但是可读不可改//2.int c = 30;double d = 40.0;const int& e = d;//d赋值给e时会生成一个临时变量,e是临时变量的别名,它具有常性,所以要加constreturn 0;}


①:引用作参数:

void swap(int& a,int&b)//a是x的别名,b是y的别名!{int c = a;a = b;b = c;}int main(){int x = 1;int y = 2;swap(x,y);cout<<x<<endl;cout<<y<<endl;return 0;}


这样做的好处是比指针传递的效率高很多。


②:引用作返回值:

我用一个ADD函数分别说明传值作返回值和传引用作返回值:

传值作返回值;

int ADD(int a,int b){int ret = a+b;return ret;}void main(){int a = 3;int b = 4;int c = 0;c = ADD(a,b);cout<<c<<endl;}

查看汇编:


画图一目了然:



传引用作返回值:

int& ADD(int a,int b){int ret = a+b;return ret;}void main(){int a = 3;int b = 4;int& c = ADD(a,b);cout<<c<<endl;ADD(10,30);cout<<c<<endl;}
我们来看看结果;




怎么会这样呢,已经把ADD(3,4)的值给了c,那么c就是7,只是做了ADD(30,10)的操作,c的值怎么会变呢?

来看汇编代码:



实际上,c也是ret的别名,但ret出了函数,已经销毁了,所以是越界。


所以说,不要返回一个临时变量的别名。,出了作用域还存在,那么可以用引用返回。




.指针与引用的区别:引用更安全,指针更灵活。

1.引用只能在定义的时候初始化一次,之后不能改变指向其他变量,但指针可变。

2.指针可以为空,引用不能指向无效的变量。

3.sizeof(引用)->所指变量的大小。

   sizeof(指针)->4或8.

4.指针++和引用++意义不同。

5.语法上,引用没开辟空间,底层上,它和指针的实现方式一样!

原创粉丝点击