C++:基础知识罗列

1.c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。
而 c++中枚举变量,只能用被枚举出来的元素初始化
(c++中的枚举更严格啊,只能用定义好的特定几个元素)
2.c++中的部分表达式可以赋值的。
(这个的实现机理应该是表达式返回了引用。可延伸考虑类定义时赋值运算符的重载, = << 等,通过引用返回对象,可以实现连续操作 )
实例: (a<b? a:b) = 200;
3.输出格式控制
#include
设置域宽及位数
对于实型,cout 默认输出六位有效数据,setprecision(2) 可以设置有效位数,
setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
printf("%c\n%d\n%f\n",'a',100,120.00);
printf("%5c\n%5d\n%6.2f\n",'a',100,120.00);
cout<<setw(5)<<'a'<<endl<<setw(5)<<100<<endl<<setprecision(2)<<setiosflags(ios::fixed)<<120.00<<endl;

cout<<dec<<i<<endl;
cout<<hex<<i<<endl;
cout<<oct<<i<<endl;
int main()
{
cout<<setw(10)<<1234<<endl;
cout<<setw(10)<<setfill('0')<<1234<<endl;
cout<<setw(10)<<setfill('0')<<setiosflags(ios::left)<<1234<<endl;
cout<<setw(10)<<setfill('-')<<setiosflags(ios::right)<<1234<<endl;
cout<<setw(10)<<setfill('0')<<1234;
cout<<setw(10)<<setiosflags(ios::left)<<setfill('-')<<56<<endl;
return 0;
}

4.c++兼容c语言,需要防命名倾轧
C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。
实现原理:用 v-c- i-f- l- d 表示 void char int float long double 及其引用

extern "C" {
int myStrlen(char *str);
}

c++ 完全兼容 c 语言,那就面临着,完全兼容 c 的类库。由.c 文件的类库文件中函数名,并没有发生 name mangling 行为,而我们在包含.c 文件所对应的.h 文件时,.h 文件要发生name manling 行为,因而会发生在链接的时候的错误。C++为了避免上述错误的发生,重载了关键字 extern。只需要,要避免 name manling的函数前,加 extern “C” 如有多个,则 extern “C”{}

5.默认函数与重载的问题:
一个函数,不能既作重载,又作默认参数的函数。当你少写一个参数时,系统无法确认是重载还是默认参数
默认参数的顺序,是**从右向左,**不能跳跃。
函数声明和定义一体时,默认认参数在定义(声明)处。声明在前,定义在后,默认参数在声明处。(在定义中不能再重复加默认值)

6引用与取地址
&符号前有数据类型时,是引用。其它皆为取地址
引用的本质是,是对常指针 type * const p 的再次包装。
char &rc == *pc
double &rd == *pd
不能建立引用的指针,可以建立指针的引用
可以定义指针数组,但不能定义引用数组,可以定义数组引用。

int a, b, c;
int* parr[] = {&a, &b, &c}; // ok
int& rarr[] = {a, b, c}; // error
int arr[] = {1, 2, 3};
int (&rarr)[3] = arr; // ok 的

double val = 3.14;
const int &ref=val;

const 引用可使用相关类型的对象(常量,非同类型的变量或表达式)初始化
int &ref=val; err 非 const 的引用不能使用相关类型初始化

实际上,const 引用使用相关类型对象初始化时发生了如下过程:
int temp = val;
const int &ref = temp;
如果 ref 不是 const 的,那么改变 ref 值,修改的是 temp,而不是 val。期望对 ref 的赋值会修改 val 的程序员会发现 val 实际并未修改

使用 const 可以处理 const 和非 const 实参。否则将只能接受非 const 数据。
使用 const 引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参数不匹配,就会生成临时变量)

7.new和delete

一维: int *a = new int[100]{0};开辟一个大小为 100 的整型数组空间
int *p = new int[5]{NULL}
二维: int (*a)[6] = new int[5][6]
三维: int (*a)[5][6] = new int[3][5][6]

char **pa= new char*[5];
memset(pa,0,sizeof(char*[5]));
pa[0] = "china";
pa[1] = "america";
char **pt = pa;
while(*pt)
{
cout<<*pt++<<endl;
}
delete []pt;

8.const_cast<目标类型> (标识符) //目标类类型只能是指针或引用
语法规则
用来移除对象的常量性(cast away the constness)使用 const_cast 去除 const 限定的目的不是为了修改它的内容,使用 const_cast 去除 const 限定,通常是为了函数能够接受这个实际参数

9.同名命名空间自动合并,对于一个命名空间中的类,要包含声明和实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值