C++入门知识点总结——基本语法

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

1.面向对象程序设计:

C++ 完全支持面向对象,包括面向对象开发的四大特性:

  • 封装
  • 抽象
  • 继承
  • 多态

C++标准库的组成:

  • 核心语言,提供了所有构件块,包括变量、数据类型和常量等;
  • C++ 标准库,提供了大量的函数,用于操作文件、字符串等;
  • 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互:

  • 对象:对象具有状态和行为;
  • 类:类可以定义为描述对象行为/状态的模板/蓝图;
  • 方法:从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作;
  • 即时变量:每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。

 

2.C++基本语法:

  • C++数据类型:布尔(bool)/字符型(char)/整型(int)/浮点型(float)/双浮点型(double)/无类型(void)/宽字符型(wchar_t);
  • 一些基本类型可以使用一个或多个类型修饰符进行修饰:signed/unsigned/short/long;
  • typedef声明:可以使用 typedef 为一个已有的类型取一个新的名字;
typedef type newname;
  • 枚举类型:枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
enum MYCOLOR{
    BLUE,
    GREE
}color;
  • C++变量的声明:当使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),使用 extern 关键字在任何地方声明一个变量。
// 变量声明
extern int a, b;
  • 变量的作用域:分为全局变量/局部变量/形式参数。
  • 常量:使用#define 预处理器/使用 const 关键字。
#include <iostream>
#define ONE  2
int main() {
    std::cout << "helloWorld" << sizeof(char);
    const int FRIST = 1;
    return 0;
}
  • 类型限定符:

const:const 类型的对象在程序执行期间不能被修改改变;

volatile:修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率;

restrict:由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。

  • 存储类:存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。

auto存储类:auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

register存储类:用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

static存储类:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值,static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

extern存储类:用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

mutable存储类:仅适用于类的对象,它允许对象的成员替代常量。

thread_local存储类:声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

  • C++函数:函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

返回类型:一个函数可以返回一个值。不需要返回关键字void;

函数名称:这是函数的实际名称,函数名和参数列表构成函数签名;

参数:参数就像是占位符。当函数被调用时,向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数;

函数主体:函数主体包含一组定义函数执行任务的语句。

函数声明:会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

调用函数:当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

函数参数:如果函数要使用参数,则必须声明接受参数值的变量,这些变量称为函数的形式参数。形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

参数的传递方式:

  1. 传值调用:该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
  2. 指针调用:该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
  3. 引用调用(引用存储地址):该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

Lambda函数与表达式:Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。Lambda 表达式本质上与函数声明非常类似。

  • C++数组:存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

声明数组:需要指定元素的类型和元素的数量;

初始化数组:可以逐个初始化数组,也可以使用一个初始化语句;

访问数组元素:数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边;

多维数组:C++ 支持多维数组。多维数组最简单的形式是二维数组。

指向数组的指针:把第一个元素的地址存储在 p 中,就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素

double *p;
double balance[10];
p = balance;

传递数组给函数:可以通过指定不带索引的数组名来传递一个指向数组的指针,传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。

从函数返回数组:C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

  • C++字符串:C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。C++中string类。
  • C++指针:

每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

指针的使用:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。

   int  var = 20;   // 实际变量的声明
   int  *ip;        // 指针变量的声明
   ip = &var;       // 在指针变量中存储 var 的地址
 
   cout << "Value of var variable: ";
   cout << var << endl;
 
   // 输出在指针变量中存储的地址
   cout << "Address stored in ip variable: ";
   cout << ip << endl;
 
   // 访问指针中地址的值
   cout << "Value of *ip variable: ";
   cout << *ip << endl;

NULL指针:在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为指针。

int  *ptr = NULL;

指针的算术运算:指针是一个用数值表示的地址。因此,可以对指针执行算术运算。

ptr++;//递增一个指针
ptr--; //递减一个指针

const int MAX = 3;
int  var[MAX] = {10, 100, 200};
int  *ptr1;
ptr1 <= &var[MAX - 1]; //指针可以用关系运算符进行比较,如 ==、< 和 >

指针与数组:一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组;

指针数组:一组存储同一类型指针的数组

   int  var[MAX] = {10, 100, 200};
   int  *ptr[MAX];
 
   for (int i = 0; i < MAX; i++)
   {
      ptr[i] = &var[i]; // 赋值为整数的地址
   }
   for (int i = 0; i < MAX; i++)
   {
      cout << "Value of var[" << i << "] = ";
      cout << *ptr[i] << endl;
   }

指向指针的指针(如二级指针):指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

    int  var;
    int  *ptr;
    int  **pptr;
 
    var = 3000;
 
    // 获取 var 的地址
    ptr = &var;
 
    // 使用运算符 & 获取 ptr 的地址
    pptr = &ptr;
 
    // 使用 pptr 获取值
    cout << "var 值为 :" << var << endl;
    cout << "*ptr 值为:" << *ptr << endl;
    cout << "**pptr 值为:" << **pptr << endl;

传递指针给函数:传递指针给函数,只需要简单地声明函数参数为指针类型即可。

从函数返回指针:必须声明一个返回指针的函数。

  • C++引用:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

引用和指针:不存在空引用,引用必须连接到一块合法的内存;一旦引用被初始化为对象就不能指向到另一个对象,指针可以在任何时候指向到另一个对象;引用必须在创建时被初始化,指针可以在任何时候被初始化。

   // 声明简单的变量
   int    i;
   double d;
 
   // 声明引用变量
   int&    r = i;
   double& s = d;
  • C++数据结构:C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。

定义结构:为了定义结构,必须使用struct语句。struct语句定义了一个包含多个成员的新的数据类型。

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

访问结构成员:为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。

结构体作为参数传递:把结构作为函数参数,传参方式与其他类型的变量或指针类似。

指向结构的指针:

定义指向结构的指针

struct Books *struct_pointer;

存储变量地址:

struct_pointer = &Book1;

使用指针访问结构的成员:

struct_pointer->title;

结构体实例:

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );
 
   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );
 
   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_id <<endl;
}

typedef关键字:可以为创建的类型取一个"别名"。

typedef struct Books    //结构体别名为Book
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

Books Book1, Book2;

//使用 typedef 关键字来定义非结构类型
typedef long int *pint32;
 
pint32 x, y, z;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章