显然上面代码中,CLS obj;这里已经为obj分配了内存,然后调用默认构造函数,但是默认构造函数还未执行完,却调用了另一个构造函数,这样相当于产生了一个匿名的临时CLS对象,它调用CLS(int)构造函数,将这个匿名临时对象自己的数据成员m_i初始化为0;但是obj的数据成员并没有得到初始化。于是obj的m_i是未初始化的,因此其值也是不确定的
从这里,我们归纳如下:
1)在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可
3)偶尔我们还是希望在类的构造函数里调用另一个构造函数,可以按下面方式做:
在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placement new做到:
先看看标准库中placement new的定义
inline
__cdecl
operator
(size_t,
_P)
{
return
(_P);
}
可见没有分配新的内存。
正确的方式:
struct
CLS
{
m_i;
CLS(
i ) : m_i(i){}
CLS()
{
)CLS(
);
}
};
另: 若构造函数调用自身,则会出现无限递归调用,是不允许的
Environment: Ubuntu 11.10 amd64. g++.You cannot call constructor from anthor constructor in C++. An alternative approach is using new (this)A(). See the code below:When I inv
C++
类和对象(类的介绍、用法等及this指针)详细解读类和对象的基本概念二级标题三级标题四级标题五级标题六级标题
类和对象的基本概念
类(class)是面向对象程序设计最基本的概念,是
C++
最强有力的特征,是进行封装和数据隐蔽的工具,它把数据与数据的操作紧密地结合起来,是
C++
封装的基本单元。
ptest =
new
test(); 这样在构造时就会调用无参构造test();
ptest =
new
test(1); 就会调用构造函数test(int),即一个整型参数的构造函数。
2 没有小括号时,默认调用无参构造。
ptest =
new
test;
和ptest =
new
test();是一样的。
加括号调用没有参数的构造函数,不加括号调用默认构造函数或
new
(this) T(t) 也叫做“
new
placement operator”。在括号中指定地址构造一个对象。例如copy赋值操作可以被下面的代码定义:
T& T::operator=( const T& other) {
if ( this != &other ) {
this->~T(); // li
先问一个问题,在
C++
里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。
非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参数的目的就是给函数提供一个基地址,以便于函数体内能找到对象的成员变量。那非静态成员函数是如何根据this指针找到成员变...
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数。【都调用构造函数】
C++
在
new
时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的
new
只分配内存空间,不进行内存的初始化,而加了括号的
new
会在分配内存的同时初始化为0。
给出两段代码
3. 不带括号的 int *b=
new
int[1000];
#include <iostream>
using namespace std;
int mai
1. this指针并不是对象本身的一部分,不影响sizeof的结果
2. this的作用域在类成员函数的内部(不严谨)
3. this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显示传递
4.只有在类的非静态成员函数中才可以使用this指针,其...