C++ 类定义与成员变量初始化

0 下载量 79 浏览量 更新于2024-08-28 收藏 42KB PDF 举报
"C++编程,讨论类的成员变量与指针的关系,以及默认构造、拷贝构造和拷贝赋值的行为。" 在C++中,定义一个类时,如果类的成员变量没有指针,那么这个类将遵循C++的默认规则来处理构造、拷贝构造和拷贝赋值。在提供的代码片段中,`DsSize` 结构体就是一个简单的例子。由于没有定义任何构造函数、析构函数、拷贝构造函数或拷贝赋值运算符,编译器会自动生成默认的实现。 代码01展示了`DsSize`结构体的默认行为。当创建`s1`、`s2`和`s3`对象时,它们分别调用了默认构造函数。每个对象都有独立的内存空间,因此它们的地址不同,证明它们是三个不同的对象。这符合C++中对象的常规行为,每个对象都有自己的数据成员副本。 代码02中,`DsSize`结构体添加了两个成员变量`width`和`height`。在`testDsSize1`函数中,直接创建`s1`对象后,尝试使用`s1`调用拷贝构造函数创建`s2`会导致编译错误,因为`s1`的成员变量尚未初始化。而在`testDsSize2`中,先为`s1`的成员变量赋值,然后使用`s1`创建`s2`,此时编译通过。这说明拷贝构造函数会复制源对象的所有成员,包括已经赋值的成员变量。 代码03中,`DsSize`结构体的成员变量`width`和`height`被赋予了默认值1,这样即使没有显式初始化,成员变量也有初始值,避免了未初始化的问题。在`testDsSize1`函数中,可以看到`s1`和`s2`的地址仍然不同,表明它们仍然是独立的对象。 总结来说,C++中的类如果没有指针成员,其对象会根据默认规则进行构造、拷贝构造和拷贝赋值。成员变量如果没有显式初始化,编译器不会自动为其分配默认值,可能导致未初始化的使用问题。为了避免这种问题,可以为类的成员变量提供默认值,或者在构造函数中进行初始化。同时,对于包含指针的类,需要特别注意内存管理,避免出现悬挂指针或内存泄漏。