C++获取目标变量的长度及类型转换
目录
1. 获取目标变量的长度
1.1 int, double, char 等变量数组长度的获取
1.2 字符串的长度获取
1.3 动态数组的长度获取
1.4 C++ STL容器(array,vector,list)的长度获取
2. 常见数据类型的转换
3. C++的几种转型(static_cast和dynamic_cast)
1. 获取目标变量的长度
1.1 int, double, char 等变量数组长度的获取
int a[10] = {1,2,3,4,5,6,7,8,9,10};
cout<<"int 型数组长度:"<<sizeof(a)/sizeof(a[0])<<endl; // 10double b[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
cout<<"double 数组长度:"<<sizeof(b)/sizeof(b[0])<<endl; // 10char c[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
cout<<"char 数组长度:"<<sizeof(c)/sizeof(c[0])<<endl; // 6
cout<<"char 数组长度:"<<strlen(c)<<endl; // 5
该形式数组由C继承而来,暂没有方法可以直接获取自身长度;
sizeof()方法可以用来获取存储区的长度,再除以数组单个成员存储区长度可获取数组元素个数;
字符串数组有strlen()方法,strlen()找到’\0‘结束,而sizeof()为存储区长度,因此结果不同。
1.2 字符串的长度获取
string d = "abcde";
cout<<"字符串长度:"<<d.length()<<endl; //5
cout<<"字符串长度:"<<d.size()<<endl; //5
cout<<sizeof(d)<<endl; //32
字符串的三种理解方式:作为字符数组,作为指向字符的指针,作为抽象的字符串整体;
字符串本质是C++的类类型,同时也可认为是C++的char*型容器,封装有size()方法和length()方法;
字符串变量长度32字节(1MB=1024Byte=8192bit)。
1.3 动态数组的长度获取
int* e = new int[10]();
cout<<_msize(e)/sizeof(e[0])<<endl; // 10
cout<<sizeof(e)<<endl; // 8
动态数组(new 方法在堆上开辟的内存);
一般动态数组长度已知(显式的分配内存),如需要,可以按照_msize(动态数组指针)/sizeof(动态数组成员)的方式获取数组长度;
sizeof()方法返回的是指针大小8字节。
1.4 C++ STL容器(array,vector,list)的长度获取
array<int, 4> f{};
cout<<"array 容器长度:"<<f.size()<<endl; // 4
cout<<sizeof(f)<<endl; // 16vector<int> g(4);
cout<<"vector 容器长度:"<<g.size()<<endl; // 4
cout<<sizeof(g)<<endl; // 24list<int> h(4);
cout<<"list 容器长度:"<<h.size()<<endl; // 4
cout<<sizeof(h)<<endl; // 24
C++11新标准规定了多个STL容器,整体效率不弱于原来的数组,可读性增强;
array容器长度同样采用size()方法获取,该容器直接对应于原来的数组;
vector容器相比于array,具有长度可变的属性;
list容器与vector相似,但从内存角度来看,两者差别巨大,list在物理内存中不连续,vector在物理内存中是连续的,由于list不连续的内存,因此list无法通过下标顺序访问。
2. 常见数据类型的转换
// double 和 int互转
int a = 5;
double b = double(a);
cout<<b/2<<endl; // 2.5double c = 3.14;
int d = int(c);
cout<<d<<endl; // 3// char 和 string互转
char e = 'e';
string f(1, e);
string g;
g.append(1, e);
string h;
h.push_back(e);
cout<<f<<endl; // e
cout<<g<<endl; // e
cout<<h<<endl; // estring i = "ijk";
char j = i[0];
char k[10];
strcpy(k, i.c_str());
cout<<j<<endl; // i
cout<<k<<endl; // ijk
cout<<"char 数组长度:"<<sizeof(k)/sizeof(k[0])<<endl; // 10
cout<<"char 数组长度:"<<strlen(k)<<endl; // 3// string 和 int/double 互转
string l = "10.1";
int m = atoi(l.c_str());
double n = atof(l.c_str());
cout<<m<<endl; // 10
cout<<n<<endl; // 10.1int o = 5;
double p = 5.5;
string r = to_string(o);
string s = to_string(p);
cout<<r<<endl; // 5
cout<<s<<endl; // 5.500000// sstream
string t;
int u = 5;
double v = 5.5;
stringstream su;
su<<u;
su>>t;
cout<<t<<endl; // 5
stringstream sv; // 更换stringstream, su流为int型量
sv<<v;
sv>>t;
cout<<t<<endl; // 5.5
1. int 和double基本类型变量可以直接强制类型转换;
2.1 char类型可以作为string的构造函数参数,实现char—>string,也可以append()和push_back(),实现char—>string;
2.2 string—>char可直接赋值,也可以采用兼容C的方式c_str()从string赋值给char*变量(注意,本例中的strcpy()是该方法的可靠用法);
3. string和int/double类型的转换可以直接使用库函数atoi(char* s)和atof(char* s),以及to_string();
4. sstream也能够可靠的支持string与其他类型变量进行类型转换,但是需要注意stream流中的数据类型。
3. C++的几种转型(static_cast和dynamic_cast)
class Base
{
public:virtual void print(){std::cout << "Base Class" << std::endl;}
};class Derived:public Base
{
public:virtual void print(){std::cout << "Derived Class" << std::endl;}
};int main()
{// 1.// Base* base = new Base();// Derived* derived = static_cast<Derived*>(base);// 2.// Base* base = new Base();// Derived* derived = dynamic_cast<Derived*>(base);// 3.Base* base = new Derived();Derived* derived = dynamic_cast<Derived*>(base);if (derived == NULL){std::cout << "Cast failed" << std::endl;return 0;}derived->print();return 0;
}
本处仅讨论由上向下类型的转换,即基类—>派生类。
第一种情况:Base Class
转型不成功,没有实现基类—>派生类的转型,由于static_cast没有自带类型检查,该过程不安全;
第二种情况:Cast failed
转型不成功,dynamic_cast会进行类型检查,转型失败返回NULL;
第三种情况:Derived Class
转型成功,实现基类指针转换为派生类指针。
C++获取目标变量的长度及类型转换相关推荐
- 数据类型(数据类型简介、数据类型的分类(简单数据类型,获取变量数据类型,数据类型转换))
目录 数据类型 数据类型简介 为什么需要数据类型 变量的数据类型 数据类型的分类 简单数据类型 获取变量数据类型 数据类型转换 数据类型 数据类型简介 为什么需要数据类型 变量的数据类型 ...
- python os.environ windows_python 获取系统环境变量 os.environ and os.putenv
从一段code说起 "if "BATCH_CONFIG_INI" in os.environ:" 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则 ...
- 风控建模系列(六):催收评分卡卡跟贷前申请卡关于目标变量的定义
关注公众号" 番茄风控大数据",获取更多数据分析与风控大数据的实用干货. 在评分卡的所有的开发流程里,我一直在强调最重要的就是关于Y变量的定义了.目标的定义是重中之重.定义一旦 ...
- 【linux】查看环境变量|getenv setenv设置获取环境变量
目录 环境变量类型 查看环境变量 系统的环境变量 进程的环境变量 初始化时载入的环境变量 执行过程中设置的环境变量 环境变量原理 通过函数存取环境变量 getenv & setenv 获取&a ...
- 如何获取目标基因的转录因子
<h1 class="post-title entry-title">如何获取目标基因的转录因子</h1><div id="toc" ...
- getDir.sh获取目标文件并将文件放到指定的目录下
#!/bin/bash #功能:获取目标文件并将文件放到指定的目录下 #使用方式:将文件放在jenkins的工作目录/mnt/jenkins/workspace中, # 通过命令行./getDir.s ...
- <渗透测试学习指南> 信息收集(三)获取目标应用版本等详细信息
转载请注明作者和出处: 本章将讲述如何获取目标系统信息.端口信息等详细信息 上一章我们讲到了获取目标真实IP及子域名信息的几种典型方法,但是单靠真实IP和子域名还无法让我们顺利的完成一项渗透测试任务, ...
- C# API之常用操作窗口类函数详解[查找所有窗口、获取目标句柄的类名、获取窗口文本、获取当前活动窗口、通过窗口句柄获取线程ID、获取指定窗口位置]
/// <summary>/// 查找所有窗口(只要是在进程里面的)/// 如果不限制类名或者标题使用null代替/// </summary>/// <param nam ...
- 计算机单位、变量、数据类型、类型转换、转义字符
计算机中最小的是bit(位) 最基本的叫字节(byte) 变量对应的作用范围可分位全局变量和局部变量 全局变量:定义在类的内部,方法的外部,作用范围是整个类,使用时不用赋值,有默认值0 局部变量:定义 ...
最新文章
- WMI技术介绍和应用——查询硬件信息
- 清华陈文光教授:AI 超算基准测试的最新探索和实践(附演讲视频)
- springcloud学习计划
- 数禾云上数据湖最佳实践
- Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=
- springboot 使用webflux响应式开发教程(二)
- 实战 | 应急响应方法论思维导图
- 物联网基础建设-园区智能微电网设计方案
- Windows Server 2008 各版本介绍
- php英文星期中文星期,英文星期到星期天【星期一到星期天的英文用中文怎么说。发音标准的来。】...
- L2-015 互评成绩
- git stash、git branch使用方法
- 六大维度层层剖析,一篇文章带你快速读懂信息无障碍
- centos修改系统可用内存_centos7开启交换内存
- java cs 顺丰运单_JAVA接入顺丰快递
- Linux云计算之VSFTP服务器概述-安装vsftp服务器端、客户端
- 从财报、抗疫回望变革:BAT的“基因改造”这些年怎么样了?
- 宽屏php模板,宽屏简洁工业网站前端模板
- 财务会计基础与报表的管理解读
- 使用Ultra Libraian生成Altium Designer元件库