注册 登录
编程论坛 C++教室

求解惑,关于初始化!

yaobao 发布于 2013-01-12 09:14, 385 次点击
看书上说初始化分两种:直接初始化和复制初始化
int ival(1024);
int ival=1024;
这两种初始化有区别吗?如果有区别在哪?
各路大神,求解惑,谢谢哦
5 回复
#2
rjsp2013-01-12 09:36
没有区别
但如果是自定义类型,且不允许隐式构造,则是
type a = type(...)
等同于
type a(...)
#3
yaobao2013-01-12 09:39
以下是引用rjsp在2013-1-12 09:36:10的发言:

没有区别
但如果是自定义类型,且不允许隐式构造,则是
type a = type(...)
等同于
type a(...)
兄台,能说的详细点吗,你知道的,我新手啊,求指教,求鞭笞。。。。
#4
rjsp2013-01-12 10:59
回复 3楼 yaobao
不是我卖关子,而是这里面细节太多,我怕没讲清到时候被人骂。
若你不介意,我就随便说说自定义类型(内建类型太简单了)

  对于 type a = val; 而言
  首先要将val转化为type,这要看构造函数了,而且是看可以隐式构造的构造函数。从这一点上来看则 type a = val; 未必等同于 type a = type(val);
  接着是那个"="(这可不是赋值操作),它对应的拷贝构造函数,因此如果拷贝构造是非public的,它就会编译失败。
  我上面没有拷贝构造函数的内容,只说其是否可见,那是因为C++规定这里需要优化,也就是只是控制由拷贝构造函数决定,但做什么却和拷贝构造函数无关。

听得更糊涂了吧?所以我一开始不想细讲^_^。我写段代码给你吧
程序代码:
#include <iostream>
using namespace std;

struct foo
{
    foo( int val ) : val_(val)
    {
        cout << "foo(int)" << endl;
    }
    explicit foo( float f ) : val_(int(f))
    {
        cout << "foo(float)" << endl;
    }
//private:
    foo( const foo& obj ) : val_(obj.val_)
    {
        cout << "foo(foo)" << endl;
    }
    foo& operator=( const foo& obj )
    {
        cout << "=" << endl;
        return *this;
    }
private:
    int val_;
};

int main(void)
{
    foo a = 0;
    cout << "----------------" << endl;
    foo b = 0.0f;
    cout << "----------------" << endl;
    foo c = foo(0.0f);
    cout << "----------------" << endl;
    foo d = foo(0);
    cout << "----------------" << endl;

    return 0;
}
体会一下,为什么是这个输出结果
然后将拷贝构造函数设为private,再编译看看,想想为什么是这样
#5
yaobao2013-01-12 12:10
回复 4楼 rjsp
真心不懂啊,还是一点点来吧,谢谢啊哥们
#6
锋了2013-01-14 21:12
楼主这个应该说的是类的内容吧,声明一个类,如果你不显式声明够造函数(即默认构造函数、赋值函数、赋值函数、析构函数),
C++会隐式的为类构造这些函数,如声明一个类class Stack{},你不显式声明Stack的默认构造函数、赋值函数、赋值函数、析构函数,
(默认构造函数、赋值函数、赋值函数、析构函数这几个事只要你声明类,都会存在的成员函数),那么C++就会为你这个类
构造他们
你声明class Stack{}
就相当于声明了
classe Stack{
public:
Stack(){}                            //默认构造函数
Stack(const Stack& rhs) {}             //copy构造函数
Stack operator=(const Stack& rhs) {}   //copy assingnment操作符
~Stack(){}
};
希望对你有用
1