`
lovnet
  • 浏览: 7018690 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++ 初始化和赋值的不同

阅读更多
c++中初始化和赋值操作差别是很大的。

对于基本数据类型差别不大:

比如:
int a = 12; // initialization, copy 0X000C to a
a = 12; // assignment, copy 0X000C to a

但是对用户自定义的数据类型比如String 初始化和赋值就差别很大:
class String {
public:
String( const char *init ); // intentionally not explicit!
~String();
String( const String &that );
String &operator =( const String &that );
String &operator =( const char *str );
void swap( String &that );
friend const String // concatenate
operator +( const String &, const String & );
friend bool operator <( const String &, const String & );
//...
private:
String( const char *, const char * ); // computational
char *s_;
};

初始化的构造过程比较简单:先分配一个足够大的空间然后填充上数据:

String::String( const char *init ) {
if( !init ) init = "";
s_ = new char[ strlen(init)+1 ];
strcpy( s_, init );
}

析构过程更简单:
String::~String() { delete [] s_; }

但是如果赋值操作就复杂多了:

String &String::operator =( const char *str ) {
if( !str ) str = "";
char *tmp = strcpy( new char[ strlen(str)+1 ], str );
delete [] s_;
s_ = tmp;
return *this;
}

看来在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了。


相关链接: C++ Common Knowledge: Assignment and Initialization Are Different

其他
机器人聊天

网摘

近日心情

爱吧

CtrlC 源代码搜索引擎



分享到:
评论

相关推荐

    解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...

    c++结构体的初始化和赋值1

    结构体的初始化和赋值是两种不同的操作,需要清楚地区分。 初始化是在声明结构体变量时就为其成员赋予初始值的过程,而赋值则是在变量已经创建后改变其值的操作。初始化是定义变量的一部分,通常在声明变量时使用...

    C++构造函数初始化列表

    构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配内存再赋值,这在效率和安全性上都有显著优势。 #### 构造函数初始化列表的作用与语法 构造函数...

    C++初始化列表使用

    C++初始化列表是一种在创建对象或构造函数执行时设置成员变量初始值的机制。它以冒号开头,后面跟着一系列用逗号分隔的成员名和对应的初始值。使用初始化列表的原因主要有性能优化和语法要求。 首先,初始化列表在...

    C++初始化成员列表.

    C++初始化成员列表 C++语言中的初始化成员列表是一种特殊的语法结构,它允许在构造函数中对类的成员变量进行初始化。这种机制可以解决一些特殊的问题,如成员变量是类类型且没有默认构造函数的类,或者const成员或...

    C++类成员和数据成员初始化总结

    在C++编程中,类成员和数据成员的初始化是一个至关重要的概念,因为它直接影响到对象的创建和使用。这里我们将深入探讨这些知识点。 首先,当创建一个C++类的对象时,对象的构造过程遵循一定的顺序。这包括两步:1)...

    C++中成员初始化列表的使用

    在C++编程中,成员初始化列表是一个非常重要的概念,尤其是在类的设计和实现过程中。本文将详细解释成员初始化列表的概念、用途以及它与传统构造函数内初始化的区别,并通过具体示例来阐述其在特定场景下的应用。 #...

    浅谈c++构造函数问题,初始化和赋值问题

    本文将深入探讨构造函数的两个重要方面:默认构造函数和初始化与赋值的问题。 默认构造函数是C++中的一种特殊构造函数,它没有参数。这种构造函数在你创建对象而没有提供明确的初始化值时被调用。例如: ```cpp ...

    C++对象初始化[文].pdf

    在C++中,对象初始化可以分为两类:初始化和赋值,它们之间有着本质的区别。 初始化是在创建对象的同时为其赋予初始值,而赋值则是替换对象当前的值。在C++中,对象初始化的方法多种多样,包括直接初始化、复制初始...

    c++能不能给类的成员变量在声明的时候初始化? - life_limbo - 博客园1

    1. **声明时初始化**:首先执行成员变量的声明时初始化,即在成员变量声明时直接赋值,如`int a = 1;`。 2. **初始化列表初始化**:接着执行构造函数的初始化列表,其中的初始化顺序与成员变量声明的顺序一致,而不...

    详解C++中变量的初始化规则

    除了用作赋值操作的左操作数,其他任何使用未初始化变量的行为都是未定义的,不要依赖未定义行为。 以int类型为例,一段简单的测试代码: #include using namespace std; int a; int main() { int b; cout &lt;&...

    成员初始化列表与构造函数体中的区别详细解析

    C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...

    c++里初始化结构体的一个比较的简单方法

    在C++编程中,初始化结构体是一个常见的任务,它确保结构体的所有成员变量都被赋予了合适的初始值。这里我们探讨两种不同的初始化结构体的方法,并分析它们的优缺点。 首先,让我们看看传统的方法,也就是在结构体...

    C++关于构造函数的初始化

    首先,C++中存在两种初始化方式:赋值运算符赋值和括号赋值。例如: ```cpp int a = 10; // 赋值运算符赋值 char b = 'r'; // 赋值运算符赋值 int a(10); // 括号赋值 char b('r'); // 括号赋值 ``` 赋值运算符...

    C语言二维数组的定义、初始化、赋值.pdf

    本节主要介绍二维数组的定义、初始化和赋值。 一、定义二维数组 二维数组的定义的一般形式是:`dataType arrayName[length1][length2];`其中,`dataType`为数据类型,`arrayName`为数组名,`length1`为第一维下标...

    C++类的初始化介绍及实现

    本篇文章将深入探讨C++中类的初始化方法,通过实例帮助读者理解和掌握。 首先,我们来看C++中如何在构造函数的成员初始化列表中初始化类的成员。成员初始化列表是一种特殊的语法结构,允许我们在构造函数定义的括号...

    C++直接初始化和复制初始化

    现在正式对C++中对象建立和初始化做一...  初始化虽然与赋值的结果很像,但是其所面临的状态和发生的时间是不同的。从他们的功能来讲,初始化与给某个变量赋值的特点是他是第一次初始化。当然当你认识到这点的时候,他

    关于C++类的成员初始化列表的相关问题

    而使用初始化列表,我们可以直接调用 `String` 类的构造函数,避免了不必要的临时对象生成和赋值操作,提高了效率。 成员初始化列表并不是一系列函数调用,而是由编译器处理的,它按照成员声明的顺序在构造函数中...

    C++初始化函数列表详细解析

    对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起),因此只能用初始化列表对齐进行初始化。成员类型是没有默认构造函数的类。若...

    C++数组的初始化.ppt

    在C++中,一维数组的初始化可以通过以下格式进行: ```cpp 类型名 数组名[常量表达式] = {值1, 值2, ..., 值n}; ``` 例如,声明一个包含10个整数元素的数组`a`并为其赋值: ```cpp int a[10] = {0, 1, 2, 3, 4, 5...

Global site tag (gtag.js) - Google Analytics