C++学习笔记——入门

在很久以前,我学习了C语言,但不能算学的好。总会在一些细节的地方掌握不到位。是C语言带我走向编程这条路,如今不能停留在C语言上面,还必须有新的武器,才这条路上走的更远。学习C++我觉得需要有一位挚友,就是他大佬。

目录

C和C++

C++的历史

命名习惯

C++入门

✦命名空间

 ✦输入输出

✦缺省参数

✦函数重载

✦引用

✦内联函数

✦auto

✦基于范围的for循环

  • C和C++

    1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

  • C++的历史

    1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。带类的C。
    1983年8月, 第一个C++实现投入使用。Rick Mascitti建议命名为CPlusPlus,即C++。
    1985年第一个C++ Release E发布。CFront的第一个商业发布,CFront Release 1.0。
    1989年,C++再次版本更新,这次更新引入了多重继承、保护成员以及静态成员等语言特性
    1998年,C++标准委员会发布了C++语言的第一个国际标准—ISO/IEC 14882:1998,该标准即为大名鼎鼎的C++98,以模板方式重写C++标准库,引入了STL(标准模板库)
    2003年,标准委员会针对98版本中存在的诸多问题进行了修订,修订后发布了C++03。
    2011年中,C++11面世。增加了许多特性,使得C++更像一种新语言,包括正则表达式、完备的随机数生成函数库、新的时间相关函数,原子操作支持、标准线程库、新的for语法、auto关键字、新的容器类、更好的union支持、数组初始化列表的支持以及变参模板的支持等等。
    后面的都是对C++进行优化了

  • 命名习惯

学习了一门新的语言,对于前面不规范的命名也应该有所纠正,对于C++内容繁多,更要注意命名方式,避免把自己绕进去。

★类名:每个单词首字母均大写,并以驼峰命名法分割单词,不包含下划线,类, 结构体, 类型定义 (typedef), 枚举 —— 均使用相同约定

class ClassTest
{
    ……
}

★变量:
 普通变量:尽量为变量起一个描述性的名字。因为能让新的代码阅读者立即理解你的代码。变量名一律小写, 单词之间用下划线连接
类的成员变量:类的成员变量以m+下划线(m_表示成员)开始, 结构体同普通变量。这样是为了同普通变量区分。
常量:可以以k字母开头,还是用单词,虽然比较麻烦,但是最好这样写,方便阅读

class ClassTest
{
   int m_test;//类的成员变量
}

String name_str;//普通变量,单个单词不用加下划线

int kAge//常量

 ★函数:函数名的每个单词首字母大写, 没有下划线。

class ClassTest
{
    ClassTest();//构造函数同类名
    
    void FunTest();//普通函数
}

以上常用命名,具体请参考 c++命名规则     谷歌命名。(我用的谷歌,类成员是以下划线结尾的)

  • C++入门

  • ✦命名空间

    为了防止命名冲突,使用namespace关键字
    一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
    命名空间的三种使用方式

    namespace Test
{
    int m_a;
    char m_b;
}
Test::m_a;//(这个是在要用的时候用)
using namespace Test;//这个时候不能再定义和命名空间内相同的变量名的变量,例如不能再定义a。会造成命名冲突(所以不建议展开,命名空间本就是解决命名冲突的)
using T::m_a;//这个是展开这个变量
::作用域限定符。
  •   ✦输入输出

    在C语言中输入输出包含着stdio.h的头文件里,在C++里包含着iostream里。但是它们都在std这个命名空间里
,素所以要使用就要这样std::cout,std::cin。但是这样太麻烦,所以在写上#include,还要写using namespace std
    cout << 变量1<<变量2<     cin >>变量1>>变量2   这个是把标准输入先给变量1,再给变量2。总之谁离得近,谁就先

  • ✦缺省参数

    在参数列表对参数进行定义,即在调用函数时,即使没有传入参数,也会有自己的参数进行运算

    int Sum(int n1 = 10, int n2 = 20)//全缺省
{
    return n1 + n2;
}    //这个时候就算没有给sum传入参数,sum最后也会计算

注意:
    从右往左一次赋值,中间不能有间隔

    int Sum(int n1 = 10, int n)//不能这样,要从右往左,依次赋值
    int Sum(int n1 , int n2 = 20)//半缺省

   不能在函数申明和定义是同时有缺省参数。如下:编译器也不会通过

    int Sum(int n1 = 10, int n2 = 20);
    int Sum(int n1 = 10 , int n2 = 20 )//错误
{
    return n1 + n2;
}
  • ✦函数重载

    同一个函数名,参数列表不同:顺序(类型不同的参数),类型,数量将构成函数重载,(只有同一个作用域)。
    在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern "C",声明是C代码
    为什么C语言没有函数重载呢?
    这个要看底层的汇编了。

int Fun2(int n1, char n2);
      "int __cdecl fun2(int,char)" (?fun2@@YAHHD@Z)
    _z3Add
extern "C" int Fun3(int n1,int n2);

   在底层,C语言对函数只是加了一个下划线,和名字的长度,而C++底层对桉树进行了修饰函数的名字以及参数类型。所以C语言不能实现函数的重载

  • 引用

    在语法上是引用实体的一个别名,没有独立空间。但是在底层是由独立空间的,是通过指针实现的

    类型& 变量 = 引用实体
    int ka = 10;
    int& ra = ka;

注意:
    必须初始化
    一个变量可以有多个引用
    一个引用只能有一个变量


const int ka = 10;
//int& ra = ka;   // 该语句编译时会出错,a为常量
const int& ra = ka;
// int& kb = 10; // 该语句编译时会出错,b为常量
const int& kb = 10;
double kd = 12.34;
//int& rd = kd; // 该语句编译时会出错,类型不同
const int& rd = kd;

 使用场景:做参数、做返回值

    void Swap(int& a, int& b)
{
   int temp = a;
   a = b;
   b = temp;
}
    int&    Retu(int& a)
{
    a += 10;
    return a;    
}

 做返回值:引用的生命周期大于函数的生命周期

引用和指针的区别:

  1. 引用必须初始化,指针不用
  2. 引用只能有一个实体,指针可以指向任意一个实体
  3. sizeof中,引用是实体类型的大小,指针在32位平台下是4个字节
  4. 引用++:实体++;指针++:偏移到下一个位置
  5. 有多级指针,没有多级引用
  • 内联函数

    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。

  1. 内敛函数对编译器只是个建议,如果函数代码太长或是有循环递归等,编译器还是会开栈
  2. 内敛函数不建议声明和定义分开,会导致链接错误
  • auto

    类型占位符编译器自动推导类型
    如果一行定义多个变量,类型要一致,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

  1. auto不能做为函数的参数
  2.  auto不能直接声明数组
  3. 实例化模板时不能作为模板参数
  4. 不能定义成员变量
  • 基于范围的for循环

    for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
    对于已确定长度数组而言,我们不用在循环条件上加上限制,避免错误
    条件:长度确定,对象可以++和==

    void MyFor()
{
    int arr[] = { 1,2,3,8,9,6,4 };
    for (auto& a : arr)
    {
        cout << a << "\t";
    }
    cout << endl;
}

你可能感兴趣的:(C++入门学习系列)