C++入门知识

一. 命名空间(namespace)

      1.1. namespace的价值

         我们知道在C语言中如果定义变量和函数不能重复名字,C++为了解决能重复命名的问题就提出了namespace的概念,在不同的namespace中可以重复使用一个名字

      1.2. namespace的定义

       • 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

      • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以重复使用一个名字来定义变量就不会有冲突了。

      • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

      • namespace只能定义在全局,当然他还可以嵌套定义

      1.3. namespace的使用   

         编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以程序有可能会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

        • 指定命名空间访问。

#include<iostream>
using namespace std;

namespace WZH
{
   int a=1;
   int b=2;
}

int main()
{
   cout<<WZH::a;
   return 0;
}

        • using将命名空间中某个成员展开。

#include<iostream>
using namespace std;

namespace WZH
{
   int a=1;
   int b=2;
}

using WZH::b;

int main()
{
   cout<<b;
   return 0;
}

        • 展开命名空间中全部成员。

#include<iostream>
using namespace std;

namespace WZH
{
   int a=1;
   int b=2;
}

using namespace WZH;

int main()
{
   cout<<a<<b;
   return 0;
}

二. C++的输入和输出

        • iostream是InputOutputStream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。

        • std::cin 是istream类的对象,它主要⾯向窄字符(narrowcharacters(oftypechar))的标准输 ⼊流。

        • std::cout 是ostream类的对象,它主要⾯向窄字符的标准输出流

        • std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区(换行)

        • >是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

        • 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。

         • ⼀般⽇常练习中我们可以using namespace std;

         •直接包含#iniclude<stdio.h>运用 printf 和 scanf 来进行输入输出。

#include<iostream>
#include<stdio.h>

using namespace std;

int main()
{
   int a=10;
   double b=3.14;
   char c='c';
   cout<<a<<" "<<b<<" "<<c<<endl;
   printf("%d %lf %c\n",a,b,c);
   
}

三. 缺省参数

        • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数)

        • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值

        • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参

        • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

#include<iostream>

using namespace std;

//全缺省
void Function1(int a=0;int b=1;int c=2)
{
   cout<<"a = "<<a<<endl;
   cout<<"b = "<<b<<endl;
   cout<<"c = "<<c<<endl;
}

//半缺省
void Function2(int a;int b=3;int c=4)
{
   cout<<"a = "<<a<<endl;
   cout<<"b = "<<b<<endl;
   cout<<"c = "<<c<<endl;
}

int main()
{
    Function1();
    Function1(1);
    Function1(1,2);
    Function1(1,2,3);

    Function2(1);
    Function2(1,2);
    Function2(1,2,3);

    return 0;
}

四. 函数重载

        C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

#include<iostream>

using namespace std;

//1.参数的类型不同
int ADD(int a, int b)
{
    return a+b;
}

double ADD(double a, double b)
{
    return a+b;
}

//2.参数的类型不同(2)
void FUN(char ch, int x)
{
    cout<<ch<< <<x<<endl;
}

void FUN(char ch, int x)
{
    cout<<ch<< <<x<<endl;
}

//3.参数的个数不同
int ADD(int a, int b)
{
    return a+b;
}

int ADD(int a, int b, int c)
{
    return a+b+c;
}

int main()
{
  return 0;
}

五. 引用

        5.1. 引用的概念和定义

           引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间

类型& 引用别名 = 引用对象

#include<iostream>

using namespace std;

int main()
{
   int a=10;

   int& b=a;
   int& c=a;

   int&d =b;
   
   //取a,b,c,d的地址看是否是同一块空间
   cout<<&a<<" "<<&b<<" "<<&c<<" "<<&d<<endl;
}

 

        5.2. 引用的特性

          • 引⽤在定义时必须初始化。

         • ⼀个变量可以有多个引⽤

         • 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

#include<iostream>

using namespace std;

int main()
{
   int a=10;
   
   //这里int& ra会报错因为没有进行初始化
   //int& ra;
 
   int& b=a;
    
   int c=20;
   
   //这里进行的是赋值运算,不是进行重新引用
   b=c;

   cout<<a<<endl<<b<<endl<<c<<endl;
}

        5.3. 引用的使用

           • 引⽤在实践中主要是于引⽤传参引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。

          • 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。

         • 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。

#include<iostream>

using namespace std;

void Swap(int& a, int& b)
{
   int tmp=a;
   a=b;
   b=tmp;
}

int main()
{
   int x=10;
   int y=20;

   Swap(x,y);

  cout<<x<<" "<<y<<endl;
}

        5.4. const引用

           • 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。

权限放大原本定义一个变量,这个变量只可以访问不能更改但是引用之后变成可以访问又可以更改就叫权限放大。

权限缩小:原本定义一个变量,这个变量可以访问可以更改但是引用之后变成可以访问更改不可以就叫权限缩小。

          • 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,也就是rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。

#include<iostream>

using namespace std;

int main()
{
   int a=10;
   int b=20;
   double c=3.14;
   int d;
  
   const int& ra=a*b;
   const int& rb=3*b;

   d=c;
   const int& rd=d;
}

        • 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。

        5.5. 引用和指针的关系

           C++中指针和引⽤在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。

          • 语法概念上引⽤是⼀个变量的取别名不开空间指针是存储⼀个变量地址,要开空间

          • 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

          • 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。

          • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

          • sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)

         • 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Main. 24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值