小编inf*_*oop的帖子

为什么最负的int值会导致有关模糊函数重载的错误?

我正在学习C++中的函数重载,并遇到了这个问题:

void display(int a)
{
    cout << "int" << endl;
}

void display(unsigned a)
{
    cout << "unsigned" << endl;
}

int main()
{
    int i = -2147483648;
    cout << i << endl; //will display -2147483648
    display(-2147483648);
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,该int范围内给出的任何值(在我的情况下int是4个字节)都将调用,display(int)并且该范围之外的任何值都将是不明确的(因为编译器无法决定调用哪个函数).int除了最小值之外,它对整个值范围有效,即-2147483648编译因错误而失败

超载的召唤display(long int)是模棱两可的

但是将相同的值与a int打印并给出值2147483648.我对这种行为感到困惑.

为什么只有在传递最负数时才会观察到这种行为?(该行为是相同的,如果一个short使用具有-32768-事实上,在负数和正数具有相同的二进制表示任何情况下)

使用的编译器:g ++(GCC)4.8.5

c++ integer overloading negative-number ambiguous-call

88
推荐指数
2
解决办法
4553
查看次数

在c ++中存储文字常量

我想知道文字常量实际存储在内存中的哪个位置?

例:

int i = 5;
char* data = char* &("abcdefgh");
Run Code Online (Sandbox Code Playgroud)

存储部分idata取决于它们的声明位置.但编译器是否存储5"abcdefgh"在将其实际复制到变量之前?

在这里我可以得到"abcdefgh"它存储位置的地址,但为什么我不能得到它的地址5

c++

4
推荐指数
3
解决办法
1242
查看次数

c ++中引用变量的内存?

我刚开始从基础知识中学习Cpp,当我遇到参考变量时我很困惑.

根据我所知,参考变量就像一个别名(同一个内存的另一个名称),所以在这种情况下它需要任何内存.

当我运行以下代码时:

class sample_class
{
    public:
        int num; //line1
        int& refnum = num; //line2
}

int main()
{
    sample_class sample_object;
    cout<< "sample_class object size : " << sizeof(sample_object) <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

sample_class对象大小:8

==>这里,大小为num4个字节(32位编译器),refnum因为引用只是一个别名num.那么,为什么在这种情况下,对象的大小是8

==>另外,如果真的refnum是一个别名,那么这个信息(refnum同样存储/别名的信息)何时num被存储?

编辑:

并考虑这种情况(changine的定义sample_class):

class sample_class
{
    public:
        char letter; //line3
        char& refletter = letter; //line4
        char letter_two; //line5
}
Run Code Online (Sandbox Code Playgroud)

在这里,如果我打印对象的对象大小sample_class,我得到它12(虽然大小letter,refletter并且 …

c++

3
推荐指数
1
解决办法
105
查看次数

在结构中定义'static const变量'是否明确地在C++ 11及更高版本中有所区别?

我理解在旧版本的C++中,const static variable在结构中分配值而不在结构外定义它将不会为变量创建内存分配,但会const static variable在编译期间用其指定的值替换它并访问其中的地址.变量给出错误(因为变量未定义/分配的内存)

struct A{
    int i;
    static const int j = 20;
}
Run Code Online (Sandbox Code Playgroud)

所以,在这里定义变量,应该用地址来访问它

const int A::j; //line1
Run Code Online (Sandbox Code Playgroud)

但是,在C++的更高版本中,即使变量未定义为line1,也会分配内存并获取其地址.

我不确定line1从C++ 11中添加版本是否会在任何其他方面产生任何差异(因为内存也是在没有此行的情况下分配的).如果它有所作为,会是什么?(它只是提供向后兼容性吗?)

请帮忙!!!

编辑:我不确定在C++ 11之前是否接受了这样的事情,但是因为我从C++ 11中观察到它,我提到它(使用MSVC++ 14.0)

更新:还观察到,当试图打印j的地址没有line1,在MSVC++ 14.0,它可以打印地址,但有gcc compiler (cpp.sh),它不能,它给出一个链接错误(undefined reference).

c++

2
推荐指数
1
解决办法
183
查看次数

有什么需要,本地静态变量在编译期间分配内存?

我正在学习staticC中的变量,并且知道static变量的内存是在编译时分配的(在编译期间需要分配多少内存并且在编译时计算其虚拟地址,在程序加载时分配实际内存)在任一数据中segment/.bss取决于是否已初始化

我在一些网站帖子中看到,由于对象/变量将采用的大小是基于变量类型预定义的,因此内存在编译时分配.但是,如果局部static变量在函数中定义且其范围仅在函数内,我不理解这种情况的必要性.

请考虑以下代码段:

void func()
{
    static int i;
    /*some logic*/
} 

void func1()
{
    static int data[10] = {1,2,3,4,5,6,7,8,9,10};
    /*some logic*/
}

int main()
{
    /*logic not involving func() and func1()*/
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,函数funcfunc1没有在程序中调用,但是static一旦程序加载(从我学到的)实际上没有使用,就会分配这些函数中的变量的内存.因此,有了这个缺点,为局部static变量分配内存的用途是什么.为什么编译器在通过函数时不能在数据段中为它们分配内存.

我已经经历了关于此的堆栈溢出问题,无法得到确切的答案 请帮助!

c c++

0
推荐指数
1
解决办法
180
查看次数

标签 统计

c++ ×5

ambiguous-call ×1

c ×1

integer ×1

negative-number ×1

overloading ×1