目录

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++获取目标变量的长度及类型转换相关推荐

  1. 数据类型(数据类型简介、数据类型的分类(简单数据类型,获取变量数据类型,数据类型转换))

    目录​​​​​​​ 数据类型 数据类型简介 为什么需要数据类型 变量的数据类型 数据类型的分类 简单数据类型 获取变量数据类型 数据类型转换 数据类型 数据类型简介 为什么需要数据类型 变量的数据类型 ...

  2. python os.environ windows_python 获取系统环境变量 os.environ and os.putenv

    从一段code说起 "if "BATCH_CONFIG_INI" in os.environ:" 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则 ...

  3. 风控建模系列(六):催收评分卡卡跟贷前申请卡关于目标变量的定义

    关注公众号" 番茄风控大数据",获取更多数据分析与风控大数据的实用干货.   在评分卡的所有的开发流程里,我一直在强调最重要的就是关于Y变量的定义了.目标的定义是重中之重.定义一旦 ...

  4. 【linux】查看环境变量|getenv setenv设置获取环境变量

    目录 环境变量类型 查看环境变量 系统的环境变量 进程的环境变量 初始化时载入的环境变量 执行过程中设置的环境变量 环境变量原理 通过函数存取环境变量 getenv & setenv 获取&a ...

  5. 如何获取目标基因的转录因子

    <h1 class="post-title entry-title">如何获取目标基因的转录因子</h1><div id="toc" ...

  6. getDir.sh获取目标文件并将文件放到指定的目录下

    #!/bin/bash #功能:获取目标文件并将文件放到指定的目录下 #使用方式:将文件放在jenkins的工作目录/mnt/jenkins/workspace中, # 通过命令行./getDir.s ...

  7. <渗透测试学习指南> 信息收集(三)获取目标应用版本等详细信息

    转载请注明作者和出处: 本章将讲述如何获取目标系统信息.端口信息等详细信息 上一章我们讲到了获取目标真实IP及子域名信息的几种典型方法,但是单靠真实IP和子域名还无法让我们顺利的完成一项渗透测试任务, ...

  8. C# API之常用操作窗口类函数详解[查找所有窗口、获取目标句柄的类名、获取窗口文本、获取当前活动窗口、通过窗口句柄获取线程ID、获取指定窗口位置]

    /// <summary>/// 查找所有窗口(只要是在进程里面的)/// 如果不限制类名或者标题使用null代替/// </summary>/// <param nam ...

  9. 计算机单位、变量、数据类型、类型转换、转义字符

    计算机中最小的是bit(位) 最基本的叫字节(byte) 变量对应的作用范围可分位全局变量和局部变量 全局变量:定义在类的内部,方法的外部,作用范围是整个类,使用时不用赋值,有默认值0 局部变量:定义 ...

最新文章

  1. WMI技术介绍和应用——查询硬件信息
  2. 清华陈文光教授:AI 超算基准测试的最新探索和实践(附演讲视频)
  3. springcloud学习计划
  4. 数禾云上数据湖最佳实践
  5. Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=
  6. springboot 使用webflux响应式开发教程(二)
  7. 实战 | 应急响应方法论思维导图
  8. 物联网基础建设-园区智能微电网设计方案
  9. Windows Server 2008 各版本介绍
  10. php英文星期中文星期,英文星期到星期天【星期一到星期天的英文用中文怎么说。发音标准的来。】...
  11. L2-015 互评成绩
  12. git stash、git branch使用方法
  13. 六大维度层层剖析,一篇文章带你快速读懂信息无障碍
  14. centos修改系统可用内存_centos7开启交换内存
  15. java cs 顺丰运单_JAVA接入顺丰快递
  16. Linux云计算之VSFTP服务器概述-安装vsftp服务器端、客户端
  17. 从财报、抗疫回望变革:BAT的“基因改造”这些年怎么样了?
  18. 宽屏php模板,宽屏简洁工业网站前端模板
  19. 财务会计基础与报表的管理解读
  20. 使用Ultra Libraian生成Altium Designer元件库

热门文章

  1. Altium 倒入Logo的最新方法
  2. python中matplotlib的使用
  3. 怎么彻底清除计算机病毒,如何彻底清除默认恶意主页?
  4. python set 嵌套_带有路径的嵌套dict中的Python setitem
  5. AutoCAD如何把三维图形展开
  6. 微软亚洲工程院院长刘震:未来机器人的发展方向以及挑战
  7. 涂鸦跳跃 java,涂鸦跳跃java
  8. 在PHP中操作JSON对象
  9. 「前端架构」React和Vue -CTO的选择正确框架的指南
  10. 做好这3点,把自己修炼为专业人才