一、背景
有了ubuntu和vscode搭建c++开发环境的经验, 现在就可以进行代码实操了;在编码前, 快速的梳理一下C++的基础知识;
什么循环、递归直接跳过, 只捡干货说;
二、关键字
2.1 auto
C++11 支持隐式类型定义了,即不指明变量的具体类型,而让编译器推导出变量的类型,而且是在编译阶段进行推导的。相当于C#中的var。

2.2 #define
使用预处理器指令#define 可以将那些经常使用的常量定义为你自己取的名字而不需要借助于变量。

通过使用 const 前缀可以定义指定类型的常量,就像定义一个变量一样:

2.3 typedef 自定义类型
typedef char C;
typedef unsigned int WORD;
typedef char * string_t;
typedef char field [50];
2.4 #undef 取消#define定义
#define MAX_WIDTH 100
char str1[MAX_WIDTH];
#undef MAX_WIDTH
2.5 #ifdef、#ifndef、#if、#endif、#else 和#elif
可以使程序的一部分在某种条件下被忽略。#ifdef 可以使一段程序只有在某个指定常量已经被定义了的情况下才被编译,无论被定义的值是什么。它的操作是:
#ifdef MAX_WIDTH
char str[MAX_WIDTH];
#endif
三、函数
3.1 参数按数值传递和按地址传递
用处: 可修改其他变量;多个返回值的实线方案;
3.2 指针函数
C++ 允许对指向函数的指针进行操作。它最大的作用是把一个函数作为参数传递给另一个函数。声明一个函数指针像声明一个函数原型一样,除了函数的名字需要被括在括号内并在前面加星号(*)。
指针函数非常有用, 懂的都懂。
四、字符串操作
4.1 char* 与 char[]
在c语言中char* 与 char[]在字符串的定义中相同,可以通过函数库(string.h)进行操作;
![]()
等价于char terry[] = "hello";
4.2 string 类
C++提供一个 string 类来支持字符串的操作,它不是一个基本的数据类型,但是在一般的使用中与基本数据类型非常相似。
string mystring = "This is a string";
string mystring = "This is a string";
string mystring ("This is a string");
4.3 字符串转换
(1)char*转换为 string
char * chstr,
char arstr[]
string str1=chstr;
string str2=arstr; //可以直接进行赋值
(2)string 转换为 char *
string str="Hi Cpp";
const char * mystr=str.c_str(); //注意要加上const.
五、指针
5.1数组中的应用
指针数组的定义:

指针数组的赋
5.2 空指针
指针 void 是一种特殊类型的指针。void 指针可以指向任意类型的数据,可以是整数、浮点数, 甚至是字符串。唯一一个限制是被指向的数值不可以被直接引用(不可以直接对空指针使用星号 “*”),因为它的长度是不定的,因此必须使用类型转换操作或赋值操作来把 void 指针指向一个具体的数据类型。
空指针的应用之一是被用来给函数传递通用参数。
六、动态内存分配
6.1 操作符 new 和 new[ ]
操作符 new 的作用是动态分配内存。new 后面跟一个数据类型,并跟一对可选的方括号([ ]),里面为要求的元素数。它返回一个指向内存块开始位置的指针。
pointer = new int;
pointer2 = new int[5];
6.2 删除操作符 delete
delete pointer;
delete [ ] pointer2;
6.3 ANSI-C 中的动态内存管理
char * ronny = (char *) malloc (10); //指定分配内存大小
int * bobby = (int *) calloc (5, sizeof(int)); //通过 5 * 4的方式分配大小
void * realloc (void * pointer, size_t size); //改变已经被分配给一个指针的内存的长度
void free (void * pointer); //这个函数用来释放被前面 malloc、calloc 或 realloc 所分配的内存块
七、模板
模板(Templates)是 ANSI-C++ 标准中新引入的概念。如果你使用的 C++ 编译器不符合这个标准,那么很可能不能使用模板,C++版的泛型。
7.1 函数模板
模板使得我们可以生成通用的函数,这些函数能够接收任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载。这在一定程度上实现了宏(macro)的作用。它们的原型定义可以是下面两种中的任何一种:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
template <class GenericType> //已经生成了一个通用数据类型的模板,叫作 GenericType
GenericType GetMax (GenericType a, GenericType b) { return (a>b?a:b); } //它被用来定义了两个参数 a 和 b,并被用作了
函数 GetMax 的返回值类型。
//例如,要调用 GetMax 来比较两个 int 类型的整数可以这样写:
int x,y;
GetMax <int> (x,y);
template <class T> T GetMax(T a, T b) {
T result;
result = (a > b) ? a : b;
return (result);
}
template <class T> T GetMax(T a, T b) {
T result;
result = (a > b) ? a : b;
return (result);
}
7.2 类模板
//类定义
template <class T>
class pair {
T values [2];
public:
pair (T first, T second) {
values[0]=first;
values[1]=second;
}
};
pair<int> myobject (115,36);
pair<float> myfloats (3.0, 2.18);
7.3. 模板的参数值
除了模板参数前面跟关键字 class 或 typename 表示一个通用类型外,函数模板和类模板还可以包含其他不是代表一个类型的参数,例如代表一个常数,这些通常是基本数据类型的。下面的例子定义了一个用来存储数组的类模板。
#include <iostream>
using namespace std;
template <class T, int N>
class array {
T memblock[N];
public:
void setmember(int x, T value);
T getmember(int x);
};
template <class T, int N>
void array<T, N>::setmember(int x, T value) {
memblock[x] = value;
}
template <class T, int N>
T array<T, N>::getmember(int x) {
return memblock[x];
}
int main() {
array <int, 5> myints;
array <float, 5> myfloats;
myints.setmember(0, 100);
myfloats.setmember(3, 3.1416);
cout << myints.getmember(0) << '\n';
cout << myfloats.getmember(3) << '\n';
}
7.4 模板与多文件工程
当工程变得越来越大的时候,程序代码通常会被分割为多个源程序文件。在这种情况下,通常接口(interface)和实现(implementation)是分开的。用一个函数库做例子,接口通常包括所有能被调用的函数的原型定义。它们通常被定义在以.h 为扩展名的头文件(header file)中,而实现函数的定义)则在独立的 C++代码文件中。
好了,有了这些基础知识, 就能勉强看懂一些简单代码了!
C++基础知识点详解
5954

被折叠的 条评论
为什么被折叠?



