网站建设最好公司,做网站项目后台的,wordpress 数据插件,制作网页教程需要什么工具文章目录 知识点 1#xff1a;C 的概述1. C的特征2. C 程序的编辑、编译和执行3. 第一个 C 源程序4. 面向对象程序设计思想4.1 面向对象程序设计思想初始4.2 面向对象程序设计思想的核心 知识点 2#xff1a;C 对 C 的扩展1. 作用域访问运算符 ::1.1 全局变量和局部变量1.2 作… 文章目录 知识点 1C 的概述1. C的特征2. C 程序的编辑、编译和执行3. 第一个 C 源程序4. 面向对象程序设计思想4.1 面向对象程序设计思想初始4.2 面向对象程序设计思想的核心 知识点 2C 对 C 的扩展1. 作用域访问运算符 ::1.1 全局变量和局部变量1.2 作用域为类域或名称空间域 2. 名称空间域2.1 创建命名空间2.2 名称空间域成员访问2.3 多文件命名空间创建 知识点 3语法增强1. 数据类型增强 知识点 4函数重载和默认参数1. 函数重载2. 默认参数 知识点 5内存管理2. new 和 malloc 的区别 知识点 6函数的占位参数知识点 7内联函数1. 内联函数的定义2. 内联函数的编译规则3. 内联函数和普通函数的区别 知识点 8C中的输入输出1. 继承 C 语言中的输入输出2. C 新增标准输入输出 知识点 9字符串类知识点 10C 内存管理1. C 语言中的内存管理方式2. C 内存管理 知识点 11函数返回值为引用知识点 12引用与指针的区别 知识点 1C 的概述
1. C的特征
C 是对 C 的扩展语言在 C 语言的基础上添加了面向对象编程和泛型编程的支持。
C 继承 C 语言的思想具备 C 语言面向过程的思想语言高效、简洁具有可移植性。C 具备面向对象程序设计思想。模板支持的泛型编程。
2. C 程序的编辑、编译和执行
由于 C 继承了 C 语言的特性C 语言程序可以作为 C 程序。在 Linux 系统中GNU 工具中提供了 C 编译器 g整个程序的编译过程依然分为 4 个阶段
整体编译g 源程序文件 可以使用 -o 指定输出可执行文件名称如果未指定则默认生成可执行文件 a.out。 预处理阶段实现预处理指令的执行头文件的展开、宏定义的替换、语句的选择编译。 g -E hello.c -o hello.i编译阶段实现预处理后程序语法的检测并生成汇编指令。 g -S hello.i -o hello.s汇编阶段将汇编指令翻译为二进制机器指令。 g -C hello.s -o hello.o链接阶段将程序中所有的 .o 文件进行链接、依赖库链接和启动程序连接。 g hello.o -o hello3. 第一个 C 源程序
#include iostream /* 添加头文件标准库头文件提供标准输入输出流 */
using namespace std; /* 名称空间声明 */int main()
{cout hello world endl; /* 标准输出流和换行 */return 0;
}C 源程序后缀可以使用 .c、.cxx、.cpp一般情况将源程序文件后缀设置为 .cpp可移植性更好。头文件的包含#include iostream。namespace用于避免同一个程序中的多个同名变量和函数的访问冲突。cout 和 endlcout 是标准输出流定义在 std 命名空间中endl 是换行标识同时刷新缓冲区。
4. 面向对象程序设计思想
4.1 面向对象程序设计思想初始
面向过程程序设计思想以解决问题的思路为步骤按照步骤先后顺序依次执行逐一解决问题的过程。核心是功能分解自顶向下逐层细化程序 数据结构 算法。面向对象程序设计思想即 OOP 技术。任何类对象都具有一定的属性和操作行为属性抽象为数据类型变量行为抽象为函数及其算法。对象 数据结构 算法程序 对象 对象 ……
4.2 面向对象程序设计思想的核心
封装将对象的属性抽象为数据类型的成员变量对象的行为抽象为成员函数并使用访问权限修饰符封装。继承表示类与类之间的关系新构造类对象继承原有类对象的属性和行为有效实现代码重用避免冗余。多态一个接口多种方法在程序运行过程中决定接口的具体行为。 知识点 2C 对 C 的扩展
1. 作用域访问运算符 ::
C 增加了作用域访问运算符 ::可修饰函数和变量的作用域实现对不同作用域下同名成员变量和函数的访问。语法格式
作用域::函数和变量符号作用域可以是全局作用域、局部作用域、命名空间域和类域。函数和变量符号可以是 C 函数和变量、类成员函数和变量以及命名空间域成员函数和变量。
1.1 全局变量和局部变量
当作用域和作用域运算符省略时模块内定义的局部变量覆盖全局变量。
#include stdio.hint a 1; /* 定义全局变量 */int main()
{int a 3; /* 局部变量覆盖全局变量 */printf(a %d\n, a); printf(::a %d\n, ::a); /* 访问全局变量 */
}1.2 作用域为类域或名称空间域
#include stdio.hint a 1;namespace myspace {int a 4; /* 变量 a 的作用域为 myspace 命名空间 */
}int main()
{int a 3;printf(a %d\n, a); printf(::a %d\n, ::a); /* 访问全局变量 */printf(myspace::a %d\n, myspace::a); /* 访问 myspace 中的变量 */
}2. 名称空间域
将符号常量、变量、函数、结构体、枚举等数据量使用关键字 namespace 的名称空间域进行封装解决程序中同名导致的访问冲突问题。
2.1 创建命名空间
有名命名空间
namespace myspace {int a 5;void show() {printf(myspace - a %d\n, a);}
}无名命名空间无名命名空间中的成员只能在当前文件中访问相当于使用 static 修饰。
namespace {int a 4;int b 5;
}2.2 名称空间域成员访问
通过作用域访问运算符访问或声明命名空间后直接访问。
std::cout namespace std::endl; /* 访问 std 名称空间域中的 cout 和 endl */
using namespace std; /* 声明名称空间域 */
cout namespace endl; /* 已声明的符号可直接访问 */2.3 多文件命名空间创建
在实际应用中可能多个文件中的成员属于同一个名称空间域。注意以下几点
头文件中不能定义变量和函数只能声明。名称空间域中的变量只能在源文件中定义作用域仅限于该文件。
namespace myspace {void test(void); /* 在头文件中声明 */
}知识点 3语法增强
1. 数据类型增强
C 提供了更严格的类型检查和更丰富的数据类型支持例如 bool 类型。
bool flag true; /* 在 C 中直接支持 bool 类型 */知识点 4函数重载和默认参数
1. 函数重载
C 支持同名但参数不同的函数这称为函数重载。不同函数根据参数类型、数量或顺序进行区分。
int add(int a, int b) { return a b; }
float add(float a, float b) { return a b; }2. 默认参数
在函数声明时可以为形参设置默认值调用函数时如果没有传递实参则使用默认值。
void printVal(int a 0, int b 0) {printf(a %d, b %d\n, a, b);
}知识点 5内存管理
C 提供了 new 和 delete 操作符来管理动态内存分配和释放与 C 语言中的 malloc 和 free 相对。与 C 语言不同new 自动推导分配空间的大小并在失败时抛出异常。
int *p new int; /* 动态分配单个 int 类型元素存储空间 */
delete p; /* 释放动态分配的内存 */2. new 和 malloc 的区别
在 C 中new 和 malloc 都用于动态内存管理但它们之间有一些重要区别 属性不同 new 和 delete 是 C 的运算符由编译器支持可以重载。malloc 和 free 是 C 语言的库函数需要包含头文件 stdlib.h无法重载。 使用方式不同 malloc 动态开辟内存时需要显示指定申请的内存大小并返回 void* 类型指针通常需要进行类型转换。int *malloc_p (int *)malloc(4); /* 开辟 4 字节的空间 */
free(malloc_p);new 动态开辟内存时自动分配适合数据类型大小的内存并返回相应类型的指针。int *new_p new int; /* 根据 int 类型分配内存 */
delete new_p;存储内存位置不同 malloc 所申请的内存一定位于堆区。new 的内存空间称为自由存储区默认使用堆区实现自由存储区。自由存储区是 C 动态内存分配和释放的概念实际存储位置由 new 实现决定。 返回类型不同 malloc 返回 void*需要进行强制类型转换。new 返回指定类型的指针无需强制类型转换。 分配失败处理 malloc 失败时返回 NULL需要手动检查是否为空。new 失败时抛出 bad_alloc 异常。 构造与析构 malloc 仅分配内存不调用构造函数需要手动初始化对象。new 会自动调用对象的构造函数delete 会自动调用析构函数。 内存扩展 malloc 可以使用 realloc 来扩展已经分配的内存。new 没有内存扩展机制必须重新分配内存并手动迁移数据。 知识点 6函数的占位参数
所谓的函数占位参数指的是在函数定义时形参列表中有些参数只定义了数据类型而没有定义形参变量名这些参数仅用于占位。例如
void func(int a, int 3) /* 第二个参数是占位参数默认值为 3 */
{printf(a %d\n, a);
}占位参数可用于区分前置和后置递增/递减运算符的重载。 知识点 7内联函数
1. 内联函数的定义
内联函数类似于 C 语言中的宏定义。内联函数通过在函数前加上 inline 关键字来声明编译器将尽量将其替换为内联代码减少函数调用的开销。
inline int func(int a) {return a;
}类中的成员函数如果定义在类的内部默认会被视为内联函数。
class Demo {
public:int func(int a) {return a; /* 类内部的函数自动为内联函数 */}
};2. 内联函数的编译规则
虽然 inline 是建议编译器将函数作为内联处理但编译器根据以下规则决定是否真正将函数内联
函数体不能包含任何形式的循环语句。函数体不能有过多的条件判断语句。函数体不能过于庞大。不能对函数进行取址操作。
3. 内联函数和普通函数的区别
占用更多存储空间内联函数在编译时将函数体替换到调用点因此会占用更多的代码空间。提高执行效率内联函数省去了函数调用时的压栈、跳转及返回操作从而提升执行效率。内联函数本质上是通过“以空间换时间”来提高性能。 知识点 8C中的输入输出
1. 继承 C 语言中的输入输出
C 继承了 C 语言的输入输出机制可以直接使用标准 C 库中的 printf、scanf 等函数实现输入输出。
2. C 新增标准输入输出 标准输出流 std::cout C 提供了 std::cout 作为标准输出流通过 重定向运算符实现输出。 std::cout Hello, World! std::endl; /* 输出字符串并换行 */注意 多个数据输出时可以使用多个 进行链接。数据可以是变量或常量。std::endl 是换行符等价于 C 语言中的 \n同时会刷新缓冲区。 标准输入流 std::cin std::cin 作为标准输入流通过 运算符实现数据输入。 int a;
std::cin a; /* 从标准输入读取数据赋值给变量 a */知识点 9字符串类
在 C 中字符串可以通过字符数组存储也可以使用 C 标准库中的 std::string 类来处理。
C 风格字符串仍然可以使用 C 语言的字符数组存储字符串。std::string 类C 中新增的字符串类提供了更多方便的操作方法和运算符重载如 进行字符串连接[] 访问字符等。
用于连接两个字符串。用于赋值操作相当于 C 语言中的 strcpy。在原有字符串后追加新字符串相当于 C 语言中的 strcat。 知识点 10C 内存管理
1. C 语言中的内存管理方式
C 语言中的内存管理包括静态分配和动态分配
静态分配全局变量、局部变量、常量的存储位置和生命周期是由编译器管理的。动态分配使用 malloc、calloc、realloc 函数动态分配内存在使用完毕后需要调用 free 释放内存。
void *malloc(size_t size);
void free(void *ptr);2. C 内存管理
C 继承了 C 语言的内存管理方式同时新增了使用 new 和 delete 运算符进行动态内存管理 使用 new 和 delete new 动态分配内存delete 释放内存。new 自动调用对象的构造函数delete 自动调用析构函数。 int *p new int; /* 分配单个 int 类型的空间 */
delete p; /* 释放内存 */new 和 malloc 的区别如前面章节中详细介绍。 知识点 11函数返回值为引用
在 C 中函数可以返回引用类型。这允许函数返回一个对现有变量的引用而不是一个新的值。
int getValue() {static int a 10;return a; /* 返回静态变量的引用 */
}引用返回值的优点可以避免不必要的内存拷贝提高程序效率。注意事项返回的引用变量必须是静态的或全局的不能是局部变量否则会出现非法访问。 知识点 12引用与指针的区别
引用和指针在 C 中有相似的作用但它们有明显的区别
引用是别名不占用额外的存储空间定义时必须初始化且不能更改引用的对象。指针是一个存储地址的变量可以为空NULL且可以在运行时指向不同的对象。访问方式引用通过变量名直接访问而指针需要通过 * 运算符进行解引用。
int a 10;
int ref a; /* 引用 */
int *ptr a; /* 指针 */到此为止我们
完整覆盖了最初的 C 知识点内容。