struct{0}二
一直以为 int a[]={};是把a的所有元素初始化为0,int a[]={};是把a所有的元素初始化为1.
调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下
5.2. 数组初始化
数组可以用一个列值来初始化,例如
int v1[] ={,,,};
char v2[]={'a','b','c',};
当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[] 和char[]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
char v3[] ={'a','b',}; //错误:太多的初始化值了
char v3[] ={'a','b',}; //正确
如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为 。例如
int v5[]={,,,};
等价于
int v5[]={,,,,,,,};
注意没有如下形式的数组赋值:
void f()
{
v4={'c','d',}; //错误:不是数组赋值
}
如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。
字符数组可以方便地采用字符串直接初始化(参考第五章 .2小节)
译注: 就是 这样啦 char alpha []="abcdefghijklmn";
The C++ Programming Language ,Third Edition by Bjarne Stroustrup. 、、、、、、、、、、、、、、、、、、、、、、、、、、、///////
/////////////////////////////////////////////////////////////
6.6 集合初始化
顾名思义,集合(aggregate)就是多个事物聚集在一起,这个定义包括混合类型的集合:像struct和class等,数组就是单一类型的集合。
初始化集合往往既冗长又容易出错,而C++中集合初始化(aggregate initialization)却变得很方便而且很安全。当产生一个集合对象时,要做的只是指定初始值就行了,然后初始化工作就由编译器去承担了。这种指定可以用几种不同的风格,它取决于正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。比如一个内部类型的数组可以这样定义:
int a[] = { , , , , };
如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化少于数据元素的个数,那将会怎么样呢?例如:
int b[] = {};
这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果定义了一个数组而没有给出一列初始值时,编译器并不会去做初始化工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个for循环,也避免了“偏移1位”错误(它可能比for循环更有效,这取决于编译器)。
数组还有一种叫自动计数(automatic counting)的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:
int c[ ] = { , , , };
现在,如果决定增加另一个元素到这个数组上,只要增加一个初始化值即可,如果以此建立我们的代码,只需在一处作出修改即可。这样,在修改时出错的机会就减少了。但怎样确定这个数组的大小呢?用表达式sizeof c / sizeof *c(整个数组的大小除以第一个元素的大小)即可算出,这样,当数组大小改变时它不需要修改。
for ( int i = ; i < sizeof c /sizeof *c; i++)
c[i]++;
因为结构也是一种集合类型,所以它们也可以用同样的方式初始化。因为C风格的struct的所有成员都是public型的,所以它们的值可以直接指定。
struct X {
int i;
float f;
char c;
};
X x1 = { , 2.2, ‘c’ };
如果有一个这种struct的数组,也可以用嵌套的大括号来初始化每一个对象:
X x2[] = { {, 1.1, ‘a’}, {, 2.2, ‘b’}};
这里,第三个对象被初始化为零。
如果struct中有私有成员(典型的情况就是C++中设计良好的类),或即使所有成员都是公共成员,但有构造函数,情况就不一样了。在上例中,初始值被直接赋给了集合中的每个元素,但构造函数是通过正式的接口来强制初始化的。这里,构造函数必须被调用来完成初始化,因此,如果有一个下面的struct类型:
struct Y {
float f;
int i;
Y(int a);
};
必须指示构造函数调用,最好的方法像下面这样:
Y y1[ ] = { Y(), Y(), Y() };
这样就得到了三个对象和进行了三次构造函数调用。只要有构造函数,无论是所有成员都是公共的struct还是一个带私有成员的class,所有的初始化工作都必须通过构造函数来完成,即使正在对一个集合初始化。
下面是多构造函数参数的又一个例子:
//: C06:Multiarg.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Multiple constructor arguments
// with aggregate initialization
#include <iostream>
using namespace std; class Z {
int i, j;
public:
Z(int ii, int jj);
void print();
}; Z::Z(int ii, int jj) {
i = ii;
j = jj;
} void Z::print() {
cout < < "i = " < < i < < ", j = " < < j < < endl;
} int main() {
Z zz[] = { Z(,), Z(,), Z(,), Z(,) };
for(int i = ; i < sizeof zz / sizeof *zz; i++)
zz[i].print();
} ///:~
注意:这看起来就好象对数组中的每个对象都调用显式的构造函数。 、、、、、、、、、、、、
/////////////////////////////////////////////////////////
该问题涉及到数据类型初始化的问题,现将C语言中数据类型初始化总结如下 简单变量的初始化形式如下: 数据类型 变量名=初始化值;
例如,定义整型变量a,并给其初始化值10的语句如下
int a=; 数组的初始化,需要通过一常量数据列表,对其数组元素分别进行初始化,形式如下:
数据类型 数组名称〔数组长度〕={初始化值1,初始化值2,…, 初始化值n}; 例如,定义长度为5的整型数组,并对其初始化的语句如下:
int A[]={,,,,}; 结构体变量的初始化方式与数组类似,分别给结构体的成员变量以初始值,而结构体成员变量的初始化遵循简单变量或数组的初始化方法。具体的形式如下:
struct 结构体标识符
{
成员变量列表;
…
};
struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };
例如,定义struct Point类型变量,并初始化的语句如下:
struct Point oP1={0.0,0.2,0.3};
struct Point类型变量oP1的三个成员变量的值分别为
oP1.x=0.0,
oP1.y=0.2
oP1.z=0.3
由于定义结构体变量有三种方法,因此初始化结构体变量的方法对应有三种,上面已经介绍了其中的一种形式,其他两种形式如下:
struct Point
{
double x;
double y;
double z;
} oP1={0.0,0.2,0.3}; struct
{
double x;
double y;
double z;
} oP1={0.0,0.2,0.3};
在初始化结构体变量时候,既可以初始化其全部成员变量,也可以仅仅对其中部分的成员变量进行初始化。例如:
struct Student
{
long id;
char name[];
char sex;
}a= {};
其相当于a.id=;a.name=“”;a.sex=‘\0x0’。
仅仅对其中部分的成员变量进行初始化,要求初始化的数据至少有一个,其他没有初始化的成员变量由系统完成初始化,为其提供缺省的初始化值。各种基本数据类型的成员变量初始化缺省值如表9-1所示。 数据类型
缺省初始化值
Int
Char ‘\0x0’
float 0.0
double 0.0
char Array[n] ”
int Array[n] {,…,} 对于复杂结构体类型变量的初始化,同样遵循上述规律,对结构体成员变量分别赋予初始化值。例如:
struct Line
{
int id;
struct Point StartPoint;
struct Point EndPoint;
}oLine1={,
{,,},
{,,}
};
其中常量0用于初始化oLine1的基本类型成员变量id;常量列表{,,}用于初始化oLine1的struct Point类型成员变量StartPoint;常量列表{,,}用于初始化oLine1的struct Point类型成员变量EndPoint。
struct{0}二的更多相关文章
- struct {0}初始化
#include <iostream> struct MyStruct { MyStruct(int a) { a = b = ; } int a; int b; }; int main( ...
- ASP.NET Core 3.0 : 二十四. 配置的Options模式
上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...
- ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用 (ASP.NET Core 系列目录). 系统环境为CentOS 8 . 打个广告,求职中.. 一 ...
- Visual Studio 2019 使用.Net Core 3.0 二
一.遇到难题 在微软官方逛了一圈,看到了这个. 马上点击,进去看看什么情况. 1.安装previewVisual studio 2019 2.设置SDK previews in Visual Stud ...
- scratch3.0二次开发scratch3.0基本介绍(第一章)
为什么要自己开发而不使用官方版本? 这个问题要看我们的做少儿编程教育的需求是怎么样的. scratch本身提供了离线版本以及官网在线平台供我们使用,这足以满足我们对于编程教学模块的需求.但是对于一些教 ...
- CRMEB小程序商城v4.0二次开发对接集成阿里云短信
作者:廖飞 - CRMEB小程序商城研发项目组长 前言 cremb小程序商城v4.0版本支持短信平台为云信,但有部分用户有需求对接阿里云短信,这篇文章将对阿里云短信平台如何对接方以及对接流程详细说明. ...
- Linux 下从头再走 GTK+-3.0 (二)
仅仅创建一个空白窗口是不够的,下面我们为创建的窗口添加一个按钮. 以 Hello,World!为例. 首先创建一个源文件:example2.c 内容如下. #include <gtk/gtk.h ...
- Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner
Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...
- spring boot2.0(二 ) lettcute访问redis
前言 此处已经省略redis的安装,请自行百度查找redis的服务端安装过程. 1.pom文件配置: <project xmlns="http://maven.apache.org/P ...
随机推荐
- Yii中使用PHPexcel获取excel中数据
1.view中代码如下: <form name="frmBatchSettle" id="" action="" method=&qu ...
- Java找出所有的水仙花数并输出
水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:371=33+73+13,371就是一个水仙花数. 要判断是否是水仙花数,首先得得到它的每一位上的数.个位数即为对10取余:十位数为对1 ...
- Laravel 5 基础(九)- 表单
首先让我们修改路由,能够增加一个文章的发布. Route::get('articles/create', 'ArticlesController@create'); 然后修改控制器 public fu ...
- [.ashx檔?泛型处理例程?]基础入门#1....能否用中文教会我?别说火星文?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_01.aspx [.ashx檔?泛型处理例程? ...
- Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)
Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...
- C基础 北京大公司面试简单总结
作者有话说 这是关于程序员面试的一篇文章, 希望对你有帮助. 干了快3年了. 可以简单参考, 对比总结.虽然本人很水. 很喜欢当前做的手游项目.做的很认真.后端每个人技术都很好.但是结果都不如意.在死 ...
- Android线程---UI线程和非UI线程之间通信
近期自学到了线程这一块,用了一上午的时间终于搞出来了主.子线程间的相互通信.当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message.我的主线程 ...
- 【js类库AngularJs】web前端的mvc框架angularjs之hello world
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核 ...
- bash: 避免命令重复执行的简单脚本
1. 根据命令生成md5做为文件名保存当前进程的pid2. 使用exec执行命令3. 如果再次执行, 使用ps -p检测上次pid是否有效, 如果是则exit 200.否则重复1.hadoop@ubu ...
- libevent 定时器示例
程序执行结果: 每隔2秒,触发一次定时器. (2)98行:evtimer_assign在event.h中定义如下: 再来看看event_assign函数: ev 要初始化的事件对象 base ...