C++中涉及到的概念

来源:互联网 发布:windows longhorn音乐 编辑:程序博客网 时间:2024/05/16 10:05

初始化与赋值的区别:

初始化:初始化计算机编程领域中指为数据对象变量赋初值的做法,如何初始化则取决于所用的程序语言以及所要初始化的对象的存储类型等属性。用于进行初始化的程序结构则称为初始化器或初始化列表。初始化和变量声明是明显有区别的,而且初始化也先于变量声明进行,但两者在实践中仍常被混淆。


在C/C99/C++中,初始化器是声明器的可选部分,它由一个'='以及其后的一个表达式(或含有多个以','隔开的带圆括号表达式的单一列表)所组成。后面这一列表有时也被称为“初始化(器)列表”(initializer list)或”初始化列表”(initialization list),不过initializer list也是C++中用于初始化类或结构中的元素的保留字。
一个包含初始化的声明则通常被称为定义。根据C++标准规定,定义是声明的一种;具体来说,声明只需为函数或数据对象指定类型即可,而定义则还必须为其赋初值

默认初始化

在程序里,数据初始化也可能在没有由明确的语法来实现的情况下进行。例如说,如果一个静态变量在没有初始化(即未指定初值)的情况下被声明,则:
对于原生数据类型:以对应类型的零值进行初始化;
对于类中的静态对象:由其默认的构造函数来进行初始化。
先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情 况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是 简单地复制类中的每个成员。


区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。int a=12 ; //初始化, copy 0X000C to a a =12 ; //赋值, copy 0X000C to a1、静态变量在定义时未显式地指定初值,则自动初始化为相应类型的零值(数值型为0或0.0;字符型为'/0'),即静态变量能够自动初始化(有称之为隐式初始化),且静态变量只初始化一次。静态变量定义时显式地指定了值,则其初值为指定的值。定义时无论是否显式地指定了初始值,都只能被初始化一次。但可以通过赋值的方式多次修改静态变量的值。2、初始化与赋值是不同的概念。静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值 因为如果赋值语句可能会调用两次该成员的构造函数,而初始化只会调用一次,一般而言,重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空间的Init函数。在这种情况下,你必须使用初始化列表,以避免不要的分配两次内存。
注意分析程序
#include "stdafx.h"#include <iostream>using namespace std;void pr();void pt();void pk();int i;int main(int argc, char* argv[]){for(i=0;i<5;i++){pr();}printf("\n");for(i=0;i<5;i++){pt();}printf("\n");for (i=0;i<5;i++){pk();}return 0;}void pr(){static int i=0;printf("%d:",i);for (i=1;i<=5;i++){printf("%c","*");}printf("\n");}void pt(){static int i;printf("%d:",i);for (;i<5;i++){printf("%c","*");}printf("\n");}void pk(){static int i;printf("%d",i);for (i=0;i<=5;i++){printf("%c","*");}printf("\n");}

运行结果:























原创粉丝点击