我有以下代码
class Test
{
public:
int &ref;
int a;
Test(int &x)
:ref(x)
{
cout<<"Address of reference "<<&ref<<endl;
cout<<"&a : "<<&a<<endl;
cout<<"this = "<<this<<endl;
}
};
int main()
{
Test *pObj = NULL;
{
int i = 10;
cout<<"Address of referent "<<&i<<endl;
pObj = new Test(i);
}
pObj->ref++;
cout<<pObj->ref;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Run Code Online (Sandbox Code Playgroud)Address of referent 002DFB3C Address of reference 002DFB3C &a : 00734C94 this = 00734C90
如您所见,Test对象是动态创建的.存储在堆栈中的变量i作为参数发送到Test类的构造函数.我打印了变量i,ref和a的地址.
问题:一旦程序控制退出声明它的块,变量i将被销毁.但动态分配对象的成员变量ref仍然会引用堆栈地址(i的地址).能够在我死后使用ref.
为什么堆对象有引用堆栈内存?为什么允许这样做?
template <class T>
class Test
{
public:
template<class U> void f(); //generic function
template<> void f<char>(); //Specialization for char.
};
template <class T>
template<class U>
void Test<T>::f() //Definition of generic function
{
}
template<>
template<> void Test<char>::f<char>(){} //Definition of specialization.
int main()
{
Test<char> ob1;
ob1.f<char>(); //Works fine.
Test<int> ob2;
ob2.f<char>(); //Produces linker error.
}
Run Code Online (Sandbox Code Playgroud)
链接器错误是
error LNK2019: unresolved external symbol "public: void __thiscall
Test<int>::f<char>(void)"
Run Code Online (Sandbox Code Playgroud)
我的要求是:我应该能够将任何类型传递给Test类,并将任何类型传递给函数f().我应该可以使用下面所有类型的组合.
Run Code Online (Sandbox Code Playgroud)Test f() -------------- int char char int int int
我可以通过定义下面的另一个函数来解决错误.
template<>
template<> void Test<int>::f<char>(){} …Run Code Online (Sandbox Code Playgroud) 这是面试问题.
是否可以像DLL一样动态链接lib?
例如,对于DLL,我们使用LoadLibrary并调用导出的函数.是否可以以相同的方式使用lib文件?
我读到多个返回和多个goto语句都是糟糕的编程习惯.我有一个功能,可以检测到8种类型的错误.如果出现错误,我应该返回错误代码还是应该使用goto statment转到函数结束并从那里返回.每当从函数返回之前需要释放内存时,我认为最好有一个goto结束并在函数结束时释放内存(这样只有一个空闲就足够了)
但是,在我的函数中,没有分配内存.在这种情况下哪一个更好?多个返回或多个goto语句?或者我们可以避免两者吗?
编辑:避免两者的一些方法是,将参数传递给可以存储errorType的函数.在继续进行之前,可以在功能内检查相同内容.但这也使代码变得丑陋.
我在Addison Wesley常见问题解答中阅读以下声明.
注意:在某些情况下,按值传递对象可能很危险.通过引用到const传递对象通常比通过值传递它们更好.例如,如果目标类型是抽象基类,则pass-by-value将不起作用,并且如果参数的类具有派生类,则可能在运行时导致错误行为.但是,如果保证参数的类不具有派生类,并且被调用的函数需要使用本地副本,则pass-by-value可能很有用.
如果目标类型是Abstract类并且参数的类具有派生类,那么它在运行时的错误行为如何?复制构造函数是否解决了这个问题?如果是这样,怎么样?谢谢.
编辑:那么,上述陈述是否应该是"编译时的错误行为"?不是"运行时".
我试图重载==运算符来比较下面的对象.
class A
{
int a;
public:
A(int x) { a = x; }
bool operator==(const A& obRight)
{
if(a == obRight.a)
{
return true;
}
return false;
}
};
int main()
{
A ob(10), ob2(10), ob3(10);
if(ob == ob2) // This equality comparison compiles fine.
cout<<"Equal"<<endl;
if(ob == ob2 == ob3) //This line doesn't compile as overloaded
// == operator doesn't return object (returns bool)
cout<<"Equal"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
如上所述,我无法在单行中进行多个对象比较,
例如 if(ob == ob2 == ob3)通过成员函数使用重载==运算符.
我应该使用友方功能超载吗?
对于以下片段,
#include <iostream>
using namespace std;
void fun(const int *p)
{
int *q = const_cast<int *>(p);
*q = *q * 10;
cout<<"q: "<<q<<"\t Value: "<<*q<<endl;
}
int main()
{
const int a = 10;
const int *z = &a;
fun(z);
cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl;
cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl;
}
Run Code Online (Sandbox Code Playgroud)
产生的产量是
q: 0x7fff65910fcc Value: 100
z: 0x7fff65910fcc Address of a: 0x7fff65910fcc
value at z: 100 value in a: 10
Run Code Online (Sandbox Code Playgroud)
为什么即使我试图在fun()中修改它,a的值也没有被修改?
为什么a和指针z的地址相同但值不同?
是const_cast的某种未定义行为吗?
我正在使用Visual Studio 2008中的c ++应用程序我用Maximize speed(/ o2)构建了我的项目(来自属性 - >配置属性 - > c/c ++ - >优化 - >优化)无法观察变量值调试代码.请帮忙.
我想在c ++上做得更好.我在main()中有一个Test类和下面的代码.
Test *pObj = new Test();
Run Code Online (Sandbox Code Playgroud)
如果我们通过逐步逐步调试来调试,首先它转到新函数来分配内存,然后调用构造函数.然后它回到main()函数.众所周知,构造函数不会返回任何内容.在那种情况下,为什么pObj将具有由new分配的指针?知道编译器是如何实现的吗?
我正在使用Visual Studio 2008.对于下面的代码
double main()
{
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
错误C3874:'main'的返回类型应为'int'而不是'double'
但如果我使用下面的代码
char main()
{
}
Run Code Online (Sandbox Code Playgroud)
没有错误.运行并退出输出窗口后显示
程序'[5856] test2.exe:Native'已退出,代码为-858993664(0xcccccc00).
问题:编译器是否从默认返回值零(整数)到char进行隐式转换?
如何生成代码0xcccccc00?
看起来该代码中的最后一个字节似乎是实际的返回值.为什么0xcccccc即将到来?