C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
C++ 完全支持面向对象,包括面向对象开发的四大特性:
C++标准库的组成:
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互:
typedef type newname;
enum MYCOLOR{
BLUE,
GREE
}color;
// 变量声明
extern int a, b;
#include
#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。
auto存储类:auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
register存储类:用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。
static存储类:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值,static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
extern存储类:用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
mutable存储类:仅适用于类的对象,它允许对象的成员替代常量。
thread_local存储类:声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
返回类型:一个函数可以返回一个值。不需要返回关键字void;
函数名称:这是函数的实际名称,函数名和参数列表构成函数签名;
参数:参数就像是占位符。当函数被调用时,向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数;
函数主体:函数主体包含一组定义函数执行任务的语句。
函数声明:会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
调用函数:当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
函数参数:如果函数要使用参数,则必须声明接受参数值的变量,这些变量称为函数的形式参数。形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
参数的传递方式:
Lambda函数与表达式:Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。Lambda 表达式本质上与函数声明非常类似。
声明数组:需要指定元素的类型和元素的数量;
初始化数组:可以逐个初始化数组,也可以使用一个初始化语句;
访问数组元素:数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边;
多维数组:C++ 支持多维数组。多维数组最简单的形式是二维数组。
指向数组的指针:把第一个元素的地址存储在 p 中,就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素
double *p;
double balance[10];
p = balance;
传递数组给函数:可以通过指定不带索引的数组名来传递一个指向数组的指针,传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。
从函数返回数组: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;
传递指针给函数:传递指针给函数,只需要简单地声明函数参数为指针类型即可。
从函数返回指针:必须声明一个返回指针的函数。
引用和指针:不存在空引用,引用必须连接到一块合法的内存;一旦引用被初始化为对象就不能指向到另一个对象,指针可以在任何时候指向到另一个对象;引用必须在创建时被初始化,指针可以在任何时候被初始化。
// 声明简单的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
定义结构:为了定义结构,必须使用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
#include
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 <author <subject <book_id <
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;