c++ 基本使用
1 枚举
enum ShapeType
{
circle,
square,
rectangle
}; int main() { ShapeType shape = circle; switch(shape)
{
case circle:
cout<<"ShapeType.circle"<<endl;
break;
case square:
cout<<"ShapeType.square"<<endl;
break;
case rectangle:
cout<<"ShapeType.rectangle"<<endl;
break;
default:
cout<<"Unknown!"<<endl;
} return ;
}; 输出:
ShapeType.circle
2. const_cast, static_cast
const int i = ;
/*
error C2440: 'const_cast' : cannot convert from 'const int' to 'int'
Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast
转换是一个合法的标准转换,可以通过隐式执行,或使用static_cast、C风格的转换、函数式转换进行
*/
//int j = const_cast<int>(i);
/* 从 const int --> int, 下面4中都可以,唯独const_cast常量转换方式不行,只是因为它是一个合法的标准转换,用简单的方式已能处理还用不到高级的const_cast常量转换 */
int j = i; //隐式转换
int h = static_cast<int>(i); //static_cast静态转换
int k = (int)i; //C风格转换
int t = int(i); //函数式转换
/*
const int * --> int * 使用const_cast常量转换
*/
int* s = const_cast<int *>(&i);
/*
error C2440: 'static_cast' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers
*/
int* w = static_cast<int *>(&i);
//long* l = const_cast<long *>(&i); // error C2440: 'const_cast' : cannot convert from 'const int *' to 'long *'
const_cast的用法:
返回该常量对应的变量 = const_cast<该常量所属的类型>(常量)
const int * --> int * 使用 const_cast
const int i = ;
/* error C2440: 'initializing' : cannot convert from 'const int *' to 'int *' */
//int* p = &i;
int* p = const_cast<int *>(&i);
const int --> int 是一个合法的标准转换,const int直接就可以隐含转换到int, eg. int i = 5;
3 union联合体
union Packed
{
char i;
short j;
int k;
long l;
float f;
double d; //该union的大小为double,8个字节
}; //分号是必须的,用于结束该union的定义 int main() { cout<<"sizeof(Packed) = "<<sizeof(Packed)<<endl; /*
* 联合体,用同一个变量,处理不同的数据类型
*/
Packed p; p.i = 'C';
cout<<p.i<<endl; p.d = 3.14159;
cout<<p.d<<endl; //此时联合体变量p保存的是d成员的值 return ;
};
4 数组
int a[10];
创建了10个存储单元连续的int型变量,但每一个变量都没有单独的标识符。相反,它们都集结在名字a下
int a[]; //数组名a的类型信息为int *
const int *p = a; //指针变量p的类型信息为int const * cout<<"a typeinfo: "<<typeid(a).name()<<endl; //int *
cout<<"p typeinfo: "<<typeid(p).name()<<endl; //int const * cout<<"sizeof(int) = "<<sizeof(int)<<endl; cout<<"a = "<<(long) a<<endl; //数组名的值 for (int i=; i<; i++)
cout<<"&a["<<i<<"] = "<<(long) &a[i]<<endl;

int型量占用4个字节,数组a占用的内存单元从176到212+4,共40个字节
数组名a的值,是第一元素a[0]的地址, a的值 与 &a[0] 相等
想给一个函数传递数组
1)声明一个数组作为函数参数
2)声明一个指向数组元素的指针
void func1(int a[], int size)
{
for (int i=; i<size; i++)
a[i] = i*i -i;
} void func2(int* a, int size)
{
for (int i=; i<size; i++)
a[i] = i*i +i;
} void print(int a[], string name, int size)
{
for (int i=; i<size; i++)
cout << name << "[" << i << "] = " << a[i] <<endl;
cout<<"--------------------------"<<endl;
} int main() { int a[]; //数组未初始化,输出的是一些无意义的值 -- 把数组a作为参数传给print函数,通过指针直接在同一块内容单元上操作,修改有效
print(a, "a", ); //初始化数组,并输出
func1(a, );
print(a, "a", ); //修改数组元素的值,并输出
func2(a, );
print(a, "a", ); return ;
};

命令行参数字符指针数组
命令行中每一个用空格分隔的字符串都被转换为一个单独的命令行参数
int main(int argc, char* argv[])
{ cout<<"argc = "<<argc<<endl; //命令行参数的个数 for (int i=; i<argc; i++)
cout<< "argv[" << i << "] = " << argv[i] <<endl; return ;
};

字符指针数组,即指向字符型的指针的数组,数组中的每个元素都是指向字符型的指针

5 函数指针
void func(int x)
{
cout<<"func("<< x <<") called ... "<<endl;
} int main(int argc, char* argv[])
{ void (*fp)(int); //定义函数指针fp, 该函数有1个int参数,无返回值
fp = func;
(*fp)(); //func(2) called ... void (*fp2)(int) = func; //定义函数指针fp, 并把函数func的地址赋给它
(*fp2)(); //func(3) called ... return ;
};
随机推荐
- 求x!在k进制下后缀零的个数(洛谷月赛T1)
求x!在k进制下后缀和的个数 20分: 求十进制下的x!后缀和的个数 40分: 高精求阶乘,直接模拟过程 (我不管反正我不打,本蒟蒻最讨厌高精了) 60分 利用一个定理(网上有求x!在 ...
- js中字符串的加密base64
base64编码主要用在传输,存储表示二进制的领域,还可以进行加密和解密.其实就是字符串的编码和解码 btoa与atob 只能加密ascii,不能加密汉字. var str = 'I LOVE YOU ...
- BZOJ 4420二重镇题解
链接 思路借鉴了这个博客: 我们可以想到状压dp 用一个十进制数来表示状态,即第i位表示位置i处的物品等级 用f[i][j][k]表示第i天,仓库的物品等级为j,状态为k时的最大收益 但是状态数貌似很 ...
- qt绘制渐变区域
// 原理:通过点到线,然后叠加成区域.同理,可使用其他图形 QPainter painter(m_pWidget); QLinearGradient linearGradient(QPointF(, ...
- kubernetes1.4新特性:支持sysctl命令
背景介绍 sysctl是一个允许改变正在运行中的Linux系统内核参数的接口.可以通过sysctl修改Linux系统内核中的TCP/IP 堆栈和虚拟内存系统的高级选项,而且不需要重新启动Linux系统 ...
- Leaflet地图框架使用手册
因为要做一个交通仿真项目,需要用到这个地图库,但是查询官方API麻烦,而且这个地图框架的API做的用起来确实太麻烦了..就从网上各种地方查找了一些,方便用, 大多都是复制,,见谅!! L.Map AP ...
- 在APPfuse中配置log4j进行定位
appFuse使用log4j进行日志输出,默认日志级别为warn,输出到串口console. 一下修改为debug级别,输出到串口及文件中: 1.修改(tomcat中的页面根目录)/appfuse/W ...
- IntelliJ Idea 复制粘贴的问题
分析 尝试从外部复制内容向Idea工作空间内粘贴文件时,有一定的几率会发生复制粘贴失败的问题:复制了新的内容,粘贴的却还是早些时候复制的旧的内容. 我使用的IDEA是最新版(2016.1.3),操作系 ...
- Ubuntu18.04+windows10双系统时间同步教程
前言: 系统安装windows10和Ubuntu18.04双系统后会出现时间不同步的情况,往往windows系统的时间会有错误,一般会有8个小时的误差. 原因: 主要因为本地时间与硬件时间的时差: 本 ...
- Xici drop flower
var xici_user_api = "http://www.xici.net/apps/wedding/?method=wedding.user.getusername&from ...