C++中没有实例化一个对象而直接用类的构造函数是怎么回事??具体问题如下

我在看一本书的时候碰着了这样的代码:
CClientDC dc(this);
dc.FillRect(CRect(point1,point2),&brush)

我不明白在第二行的第一个参数,
FillRect的第一个参数是(LPCRECT lpRect)需要一个CRect对象的指针,而这里并没有实例化一个对象,直接调用了CRect的构造函数,问题在:
1 不是只有静态函数才可以在没有实例化对象时调用吗?
2 构造函数也并没有返回值啊

我看有的解答说是创建了一个临时对象,临时对象是个什么东西?创建条件是什么?还有就是FillRect的第一个参数应该是一个指针类型,而构造函数CRect没有返回值啊,数据类型都不匹配,这句话怎么还会成立?

CRect类,有一个自动类型转换函数到LPCRECT,

// convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT() throw();
operator LPCRECT() const throw();

这个不是自动转换的函数。
而是重载了LPCRECT()运算符而已,其实没有产生对象,这其实只是一个运算符而已。
只是把实参的数据传递过去了,但是并没有产生所谓的临时对象。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-02
这个就是就是创建临时对象

可以跟int等基础类型比较,
如一个函数声明是
void fun(int a);
它需要传入一个整数

你既可以写成
int a = 10;
fun(a);

也可以写成
fun(10);

另外,这里写的CRect,不能理解成构造函数,而是类型名称

CRect(point1, point2)的意思是:
用(point1, point2)来构造一个CRect的对象,
编译器会根据(point1, point2)的类型去寻找一个适当的构造函数来用。

关于类型匹配的问题,
CRect类,有一个自动类型转换函数到LPCRECT,
class CRect {
......
// convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT() throw();
operator LPCRECT() const throw();本回答被提问者和网友采纳

在c++中为什么基类不缺省构造时候派生类要调用基类构造函数进行初始化...
首先,C++本身就规定创建子类对象的时,先调用基类的构造函数,然后再调用自己类的构造函数。当我们的基类没有自己定义构造函数时候(就是系统默认的构造函数)时。创建子类对象会先默认调用基类的默认构造函数。但是,当我们的基类自己定义了构造函数,(可能定义了很多个)此时不会再自动生产默认构造。但是...

C++中用new运算符创建一个类的数组指针会调用类的构造函数吗
当然会执行,不论是什么情况,只要你实例化了一个类也就是当你创建了一个对象时,就会自动调用构造函数。

C++问题求解,在类中为什么不能给数据成员初始化值:
因为类只是定义的类型, 还没有实例化,也就是没有定义类的对象(变量), 没法存储 你可以在初始化列表里进行初始化 , 而构造函数的函数体之内赋值的话, 是在初始化后,--- 至于定义成static的, 这是静态的, 所有对象共享一个副本, 程序开始执行就初始化了, 就算没有定义对象, 也有它的实例, ...

c++中如何让类只能实例化一个对象?
然而,这种方式存在内存泄漏问题,通常通过引入智能指针或静态嵌套类等方法解决。懒汉式实现需注意线程安全,避免多线程环境下出现竞态条件。C++11引入原子操作解决了内存模型中的同步问题,确保了实例的正确初始化。饿汉式单例模式在程序启动时即完成实例化,避免了线程安全问题,但可能引起非本地静态对象的初...

求助!C++中类的构造函数与创建动态对象的问题!
{ i = x; j = y; },这个函数是有参数的,你不写函数直接调用当然会出现编译错误。解决办法是:在第二段代码的类a中定义多个构造函数,如下所示:class a { public:a (int x,int y){ i = x;j = y;} a (void){ \/\/初始化为默认值 i = 0;j = 0;} private:int i,j;};...

c++中什么时候调用构造函数和析构函数
,构造函数就相当给对象a初始化而已,就相当于c语言中 int a = 3 初始化a的值而已,以为你在类中是不能直接给private中的类成员赋值的,所以就靠构造函数,不过要注意有参构造和无参构造,默认都是无参的,比如你A a(1, 3)这样的就不对了 除非你在类中写一个带参数的构造函数。

关于c++STL中,使用mem_fun的问题
STL的标准算法是不支持传入一个“成员函数指针”的(因为当没有实例化的对象的时候,成员函数根本不知道this是谁),但是支持“普通函数指针”或“仿函数”,而mem_fun、mem_fun_ref的作用就是将一个"成员函数指针"包装成一个仿函数。你说for_each的问题,关键是,它传入的是一个对象,而不是一个...

您好,请问在c++里构造函数有什么用呢,为什么要添加构造函数呀?什么时 ...
顾名思义,构造函数就是在定义类对象的时候调用,如果你在类里面没有定义构造函数的话,系统会提供一个默认的构造函数,虽然它什么也不做。构造函数可以重载,每一个类的对象的建立时都会调用相应的构造函数。暂时就想到这么多了,其实随便一本C++入门教材里都有。

c++什么叫构造函数,它的作用是什么
构造函数的作用:初始化对象的数据成员。二、 构造函数的种类class Complex { private : double m_real; double m_imag;public: \/\/ 无参数构造函数 \/\/ 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做 \/\/ 只要你写了一个下面的某一种构造函数,系统就不会再自...

C++中,直接调用类的构造函数的同时就会调用析构函数
s::s();\/\/构造一个临时的匿名对象,该对象在遇到分号后消亡*sp = s::s(); \/\/同上,这里s::s()构造的是匿名对象,遇到分号后消亡,\/\/s::s()的作用是用来做为中间量传给sp,但sp不会消亡delete sp;\/\/delete调用析构函数 free不会调用,这是常识若有不明白的,请追问,满意请采纳~...

相似回答