
C++
从零开始学习C++
gltzlike
To be a better man !
展开
-
尝试实现带有迭代器的 vector
两个注意点:1)底层内存分配采用 new 和 delete,非 stl 书中所示 2)移动元素为集体后移,并非原书中拆解后移(原书移动方式原因未知)#include <iostream>#include <algorithm>#include <string>using namespace std;template<class T>class MyVector{ protected: T* st...原创 2021-10-21 00:10:56 · 217 阅读 · 0 评论 -
6.192 定位new运算符(部分待定)
1. new new 可以开辟空间,和 malloc 类似。不过,new 可以在分配空间时进行初始化(类似于 calloc),还可以在指定内存处分配空间。具体用法见下例:#include <iostream>#include <new> // 定位new运算符使用的头文件/* 动态存储持续性:动态内存是由new和delete运算符进行控制,而不是由作用域和链接性规则进行控制 动态内存和自动内存不同,它不是LIFO(后入先出)。...原创 2021-09-10 00:27:01 · 283 阅读 · 0 评论 -
6.191 单独编译,存储持续性,作用域和链接性
外部链接性意味着文件间可以共享,内部链接性意味着只能在文件内部共享,无链接性就是局部变量,不可共享。 例如使用具有外部链接性的全局变量。创建 test.cpp,内容为:int global = 1000; 另创建 main.cpp,其内容如下。最终可以输出 global 为 1000。#include<iostream>using namespace std;extern int global; // 注意...原创 2021-09-08 20:54:50 · 197 阅读 · 0 评论 -
6.184 默认参数与占位参数
与 python 中的默认参数类似,C++ 中同样支持默认参数。默认参数是给形式参数加上默认值。如果调用函数时传入了对应的实参,就使用实参的值替换默认值,如果没有传入实参,形参则使用默认值。注意事项: 1)如果某个形参数有默认值,那么从这个位置开始,后面所有的形参都必须有默认值 2)默认参数只能从右往左添加默认值3)默认参数应该放到函数原型中,而不是...原创 2021-09-08 17:31:38 · 140 阅读 · 0 评论 -
6.179 引用和指针
引用的底层实现和指针常量(* const)相同,具体的区别见:https://www.cnblogs.com/this-543273659/archive/2012/07/01/2572056.html 下面的 demo 为引用的基本用法,包括数组的引用。数组指针,函数指针,数组引用定义形式都是相同的,注意类型 + (*) 或者 类型 + (&)。例如 int (*arr) [5] 和 void (*fun)(int, int) 以及 int(&rarr) ...原创 2021-09-07 22:30:12 · 81 阅读 · 0 评论 -
6.178 内联函数
内联函数与宏函数的区别:http://www.cnitblog.com/guopingleee/archive/2009/02/16/54625.html。 总体说来,内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。...原创 2021-09-07 20:48:47 · 94 阅读 · 0 评论 -
6.143 指针习题10
关于二维数组,指针运算问题,注意二维指针需要解两次引用,即第 0 个元素是 *(*a)。见下例:#include <iostream>using namespace std;int main() { int a[3][7]; int count = 1; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 7; ++j) { a[i][j] = count++; }...原创 2021-09-06 15:45:08 · 98 阅读 · 0 评论 -
6.130 字符串指针和字符数组的区别
字符串指针: 1)字符串指针变量存储在栈区,其指向的字符串存储在常量区。 2)字符串指针变量存储的字符串首字符的地址,并非整个字符串 3)不能对指向的字符串做任何修改,char * 本质为 char const * 4)字符串指针变量可以做 ++ 操作 字符数组: 1)字符数组直接在栈区开辟空间(和编译器有...原创 2021-09-06 14:31:23 · 151 阅读 · 0 评论 -
6.118-119 普通局部和全局变量,静态局部和全局变量
1. 普通局部变量 1)代码位置:在代码块 { } 内部定义的变量,包括方法参数列表定义的变量 2)存储空间:栈内存 3)作用范围:离其最近的 { } 之间 4)生命周期:代码块执行时创建,代码块执行完销毁注意事项: 1)局部变量,不初始化时不可使用 2)同一个作用域中不能有同名的变量 3)不同的作用域中的局部变量...原创 2021-09-03 20:52:15 · 196 阅读 · 1 评论 -
6.113 指针和数组
1. *p++,(*p)++,*(p++) * 和 ++ 运算优先级相同,所以在同时出现时,需要从右向左逐次运算。以下述代码 *p++ 为例,首先应该运算 p++,由于 p++ 是使用 p 后再加 1,故 p 值不变的情况下,先执行 *p 运算,而后 p++。*p 结果为 10,故 *p++ 的结果为 10,此时 p 指向 20。 在此基础上,(*p)++ 先执行 *p 为 20,而后对 *p 进行自加,类似于 cout << i++ ,所以 (*p)++ 输...原创 2021-09-03 10:17:21 · 106 阅读 · 0 评论 -
6.87 C++ 数组元素反转
在不申请另一个数组的情况下,定义 i j 指标分别指向数组头和尾,然后利用中间变量,i++,j-- 遍历互换。#include <iostream>#define LEN(array, type) (sizeof(array)/sizeof(type))using namespace std;void TestReverseArray(){ int array[] = {1,2,3,4,5,6}; int length = LEN(array, int);...原创 2021-09-02 17:24:19 · 236 阅读 · 0 评论 -
6.84 C++ 遍历数组的几种方式
1. 计算出数组长度进行遍历 数组类型确定,数组中每个元素本身的字节大小就已经确定,利用 sizeof() 函数可以计算出数组长度,而后利用 for 循序进行数组的遍历。2. 使用类似 foreach 的方式进行遍历 C++ 中也可使用类似 foreach 的方式进行遍历,使用方法为 for(int index:array)。#include <iostream>#define LEN(array, type) (sizeof(array)/si...原创 2021-09-02 16:49:49 · 3211 阅读 · 0 评论 -
6.63 猜数字之生成随机数
1. 生成 [m,n] 的随机数 [m, n]的元素个数为 n-m+1,若利用模进行 %(n-m+1) 运算,其结果为 [0, n-m]。此时左右两边同加 m,其结果为 [m, n]。void TestRand(){ // 生成 [m,n] 的随机数 // rand()% (n - m + 1) + m srand(time(0)); int a = rand(); cout << a << endl;}...原创 2021-09-02 14:46:21 · 97 阅读 · 0 评论 -
6.46 C++ 运算符
cmake_minimum_required(VERSION 3.17)get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)string(REPLACE " " "_" ProjectId ${ProjectId})project(${ProjectId} C)set(CMAKE_C_STANDARD 11)include_directories("include")if (WI...原创 2021-09-02 08:25:00 · 152 阅读 · 0 评论 -
2-1 编译型语言
1. 编译语言的层次和类型 机器语言,汇编语言,编译型语言,解释型语言,脚本语言。 编译型语言一般需要经历编译和链接的过程,才能变成真正的可执行程序。编译链接的过程如下图所示。...原创 2021-08-17 08:55:10 · 88 阅读 · 0 评论