一. C++基础

文章参考:

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)_白鳯的博客-CSDN博客

1. 一个简单的案例

#include <iostream>   //编译预处理命令
using namespace std;    //使用命名空间

int add(int a, int b);       //函数原型说明

int main()  //主函数
{
	int x, y;
	cout << "Enter two numbers: " << endl;
	cin >> x;
	cin >> y;
	int sum = add(x, y);
	cout << "The sum is : " << sum << '\n';
	return 0;
}

int add(int a, int b) //定义add()函数,函数值为整型
{
	return a + b;
}

2. 输入输出

相较于C,C++提供了更加便利的输入(cin)输出(cout)方式,其特点如下:

  • 输出自适应类型,无需像C一样规定输出的类型。
  • 可连续输入输出。
  • 依赖于<iostream>文件
  • 默认情况下,运算符>>将忽略空白符,然后读入与后面变量类型相对应的值,也就是说,>>运算符无法直接输入空格、回车符、制表符,但我们可以通过ASCII码转义来输入空格、回车符、制表符。
int x;
int y;
cin >> x >> y;      // 输入
cout << x << "\n" << y <<endl;  // 输出,endl是换行符

3. 内联函数

定义:在函数声明和定义语句之前加上inline,该函数就可以被声明为内联函数。

作用:每当程序中调用内联函数时,C++编译器就会将函数的代码替换到调用该函数的地方,从而消除调用函数时的系统开销,以提高运行速度。

注意:

  • 虽然是将代码替换过来,但对于形参的操作没有变化,除非使用指针或引用,否则依旧无法改变实参的值。
  • 内联函数内一般不要有复杂控制语句,如for、switch、while。
  • 内联函数实际上是空间换时间的操作,因此如果内联函数较长、较复杂、调用较为频繁,则不建议使用。
  • 内联函数可以在一定程度上代替宏定义,从而消去宏定义的不安全性。

4. 带有默认值参数的函数

说明:C++中函数的参数域可以带有默认值,在进行函数调用时,如果传入的实参个数小于函数的形参个数,那么将从左到右,先将将传入的实参值给到形参,然后剩下的形参取默认值。

EG:

// 参数默认值
void defaultParam(int a, int b=10, int c=10);
void defaultParam(int a, int b, int c){
    cout << "a==" << a << "\r" 
         << "b==" << b << "\r"
         << "c==" << c << endl;
}

注意:

  • 在函数原型中,所有有默认值的参数都必须位于没有默认值的参数的右边。

  • 在函数调用时,若某个参数省略,则其后的参数皆应省略而采取默认值。不允许某个参数省略后,再给其后的参数指定参数值。

  • 一个函数可以经过多次声明,但在给定的作用域内一个形参只能被赋予一次默认实参,也就是说,函数在后续声明中只能赋予没有默认值的形参以默认实参,且该形参的右侧所有形参必须都有默认值。同时也要注意函数定义时也是如此(但函数定义只能定义一次)。

    int f(int a,int b,int c,int d); 	//第一次声明
     
    int f(int a,int b,int c,int d=0);	//第二次声明,添加默认实参d
     
    int f(int a,int b,int c=1,int d);	//第三次声明,注意此处不能再次赋予形参d一个值
     
    int f(int a=4,int b=3,int c,int d); //第四次声明,注意一旦形参a赋值后,其后所有值都必须有默认值,且不能重复赋值已有实值的形参
     
    //函数定义,注意在定义时不能再次给已有默认值的形参赋值
    int f(int a,int b,int c,int d){/**/};
     
    //虽然函数可以多次声明,但是只能定义一次。
    int ff(int m=0,int n=1,int p=2){/**/};
    
  • 带默认值的函数和函数重载一起使用,可能会引发二义性。

    void Drawcircle(int r = 0, int x = 0, int y = 0);
    void Drawcircle(int r);
    Drawcircle(20);
    

5. 函数重载

定义:在同一作用域内,只要函数的参数列表不同(包括参数种类不同,或参数个数不同,或二者兼有),那么这些函数就可以使用相同的函数名。

void ioFun();
void ioFun(int a);
// double ioFun(); 会报错,因为函数重载条件不包括返回值类型。

注意:

  • 函数重载对函数返回值不敏感,对参数名也不敏感,因此无法通过它们实现函数重载。
  • 函数重载与带默认值的函数一起使用,有可能引起二义性。

6. new和delete

说明:不同于C的malloc()free(),C++提供了运算符newdelete来对堆区进行动态内存管理,且使用更加方便。

EG:

void assignMemory(){
    // 为基础类型分配空间并初始化
    int *a = new int(99);   // 为a分配sizeof(int)的空间并将其初始化为99
    cout << *a <<endl;
    delete a;               // 释放sizeof(int)的空间
    // 数组分配空间并初始化
    int *p = new int[10];       // 为p分配sizeof(int)*10的空间,未初始化
    for (int i = 0; i < 10; i++)
    {
        p[i] = i;
    }
    delete []p;                 // 释放p指向的数组的空间
}

注意:

  • 当内存分配失败时,new会返回空指针NULL
  • 分配的内存一定要记得释放

7. 引用(reference)

说明:引用就是为变量起别名,当使用该别名时,操作的空间和原变量的空间地址一模一样,省略了使用指针操作时的解引用过程。

语法:

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

注意:

  • 引用本身并不是一种数据类型,它的存在依赖于其它变量,因此引用在声明时就必须初始化,不能先声明再初始化
  • 不能建立起void类型的引用。
  • 因为引用本身不是一种数据类型,必须依存于其它的是数据类型,因此不能建立起引用的引用,也不能有指向引用的指针。
  • 可以用const对引用加以限定,不允许改变该引用的值,但是它不阻止引用所代表的变量的值。
  • 和指针不同,指针本身就是一种基础数据类型,用于保存地址,大小固定为8个字节;而引用的大小则随着其相连变量的大小而变化,如应用int类型,那就是4个字节,引用long long int类型,就是8个字节。
posted @   BinaryPrinter  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示