第1章 C++编程常用技术

函数重载

使用同一函数名定义多个函数,但必须参数个数不同或类型不同(比如说<int>或<double>的a,b比大小)

int min(int a, int b,int c) {
  if (a>b)a=b;
  if(a>c)a=C;
  return a;
}
long long min(long long a,long long b, 1ong long c) {
  //与上面那个函数的差别是参数的类型不同
  if (a>b)a=b;
  if (a>C)a=C;
  return a;
double min(double a, double b) {
  //这个函数与以上的差别是只有2个参数
  if (a-b>(1e-5) )a=b;
  return a;
}
函数模板

建立通用函数

template<typename T>
T min (T a, T b, T c) {

}
sizeof和strlen的区别

(1) strlen()是函数,在运行时才能计算。参数必须是字符型指针( char*), 且必须是
以'\0'结尾的。当数组名作为参数传人时,实际上数组已经退化为指针了。它的功能是返回
字符串的长度。
(2) sizeof() 是运算符,而不是一个函数,在编译时就计算好了,用于计算数据空间的字节数。因此,sizeof 不能用来返回动态分配的内存空间的大小。sizeof 常用于返回类型和静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

char  a[10] = "hello"

sizeof(a) 10
strlen(a) 5
数组与指针
int *p;
int a[10];
p = a 等价于 p = &a[0]
可以通过 *(p + i) 或者 *(a + i) 访问 a[i]
  • 数组指针/行指针
int (*p)[n]  p是一个指向一位数组的步长为n的行指针
int a[3][4];
int (*p)[4];  该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;    将该二维数组的首地址赋给p,也就是a[0]或&a[0] [0]
P++;    该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1] []

所以数组指针也称指向一维数组的指针,亦称行指针。
  • 指针数组
int *p[n]
p[0] = &a;

int *p[3]
int a[3][4]
for (unsigned int i = 0; i < 4; ++i) {
  p[i] = a[i];
}
刚开始我对p[i] = a[i]表示困惑.为什么左侧是一个指针的值右侧也是一个值,
(在我看来右侧应该为一个地址),然后发现a是二维数组,a[i]表示行数组的首地址

表示a[i][j]
*(*(p[i]) + j)
p[i][j]
*(*(p + i) + j)
(*(p + i))[j]

函数指针

#include<iostream>
using namespace std;
int Mmin(int x, int y) {
  if (x<y) return X;
  return y ;
}
int Mmax(int X, int y) {
  if(x>y) return X;
  return Y ;
}
int main() {
  int (*f)(int x, int y);
  int a=10,b=20;
  f=Mmin;
  //把Mmin函数的入口地址赋给f
  cout << (*f) (a,b)<<endl;
  f=Mmax;
  //把Mmax函数的入口地址赋给f
  cout << (*f) (a,b)<<endl ; ;
  return 0;
}

注意(*f)的括号

共用体

使用union关键字定义.在一个共用体里定义多种不同的数据类型,这些数据共享一段内存,所有的数据成员具有相同的起始地址

union StateMachine
{
   char character;
   int number;
   char *str;
   double exp;
};

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员

  • 使用Union判断系统是大端还是小端
    int a = 0x01 00 00 04
    大端模式(高地址对应低字节)

    小端模式(高地址对应高字节)
高地址与低地址
高字节与低字节

如int a=16777220,化为十六进制是0x01 00 00 04则04属于低字节,01属于高字节(就像单片机里常说的高八位和低八位)

union Test
{
    /* data */
    short s;
    char c[sizeof(short)];
};

int main() {
    Test tst;
    tst.s = 0x0102;
    if (tst.c[0] == 0x02 && tst.c[1] == 0x01) {
        cout << "Little endian." << endl;
    }
    else if (tst.c[0] == 0x01 && tst.c[1] == 0x02) {
        cout << "Big endian." << endl;
    }
    else {
        cout << "unknown." << endl;
    }
}

16进制的一位表示两个字节有什么问题?

用 2 Bytes的short存储0x0102 2 Bytes * 4 = 8 Bytes不会溢出吗? 
2 * 4前面那个 2 是16进制有16 ÷ 8(位1字节) = 2(字节),后面的 4 指的是有 4 位,合起来就需要8个字节
  • 这样的思路是错误的

通过位表示的数不是线性增长而是指数增长的

最后一位是2 ^ 4,表示4 bit,0x0102需要的内存应该为
4 bit * 4 = 16 bit = 2 Bytes

参考资料

https://blog.csdn.net/oqqhutu12345678/article/details/82823890
https://www.cnblogs.com/fightformylife/p/4160247.html

枚举

enum 枚举类型名 {枚举常量表列};
枚举相当于定义了一种新的类型,这种类型下的值只有枚举常量表列里的值.

enum weekday{ sun, mou, tue, wed, thu, fri, sat};
enum weekday a, b, c;

a = sun;

强制类型转换,因为2不是枚举元素
a = {enum weekday} 2;

共用体内存占用

union A{
  int a[5] ;
  char b;
  double C;
};
sizeof(A) 24

sizeof(int) * 5 = 20  不为sizeof(double) 8 的倍数

预处理

宏定义
#define PI 3.1415926

注意误用

#define N 2+9
N * N == 2+9*2+9

带参数的宏定义误用

#define area(x) x*x
area(2+2) == 2+2*2+2
#define area(x) (x)*(x)
area(2+2)/area(2+2) == (2+2)*(2+2)/(2+2)*(2+2)

所以应该按如下定义

#define area(x) ((x)*(x))
条件编译
#define _DEBUG_
#ifdef 标志符  倘若宏定义了此标志符,则进行程序段1,否则进行程序段2
  程序段1
#else
  程序段2
#endif

extern "C"块的应用

#ifdef __cplusplus
  extern "c" {
#endif
  程序段
#ifdef __cplusplus
  }
#endif

C语言无法区分重载函数的不同,在C/C++混合编程的环境下,extern "C" 告诉C++编译器这段代码按C标准编译

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352