5

假设在我的 main 方法中,我声明了一个指向在堆上创建的数组的 const int 数组指针。然后我想在构造函数 TryInitialize() 中初始化它的值(使用内存地址),然后将它们打印出来。这不起作用,我想知道我做错了什么?谢谢!

#include "stdafx.h"
#include "part_one.h"
#include <string>
#include <iostream>

using namespace std;

string createTable(unsigned int* acc, double* bal, int n) {
    string s;
    char buf[50];

    for (int i = 0; i < n; i++) {
            sprintf_s(buf,"%7u\t%10.2f\n",acc[i], bal[i]);
            s += string(buf);
    }

    return s;
}



int _tmain(int argc, _TCHAR* argv[])
{

    const int *tempInt = new const int[4];
    TryInitialize(tempInt);
    std::cout << tempInt[1] << endl;

    system("pause");

    return 0;
}

这是我的构造函数的代码:

#include "part_one.h"


TryInitialize::TryInitialize(void) {

}

TryInitialize::TryInitialize(int constInt[]) {
    constInt[0] = 8;
    constInt[1] = 0;
    constInt[2] = 0;
    constInt[3] = 8;
}
4

3 回答 3

3

您不应更改const值。

对于您要完成的工作,我建议声明一个非常量指针和一个常量指针,并在初始化后将非常量指针分配给常量指针:

int _tmain(int argc, _TCHAR* argv[])
{
    const int *tempTempInt = new int[4];
    TryInitialize(tempInt);
    const int* const tempInt = tempTempInt;
    std::cout << tempInt[1] << endl; //this is now constant.

    system("pause");

    return 0;
}

还要注意将 const 放在指针声明中的位置:

const int* const tempInt = tempTempInt;

在上面的声明中,第二个const意味着你不能改变指针;第一个const意味着您不能更改指向的值。

于 2013-02-01T01:19:00.237 回答
1

您将指针声明为const int*. const修饰符意味着您不能更改数组值。

要么删除const,要么为其创建一个初始化方法,该方法可以分配数组并返回它(与构造函数不同)。

const int* init_my_array()
{
  int * ret = new int[4];
  ret [0] = 8;
  ret [1] = 0;
  ret [2] = 0;
  ret [3] = 8;
  return ret;
}
...
const int *tempInt = init_my_array();
于 2013-02-01T01:15:47.303 回答
0

你没有。为什么?因为如果它是 const,那么一旦构造了对象就不能更改它。注意:即使设置它也会有效地改变其未初始化值的值,这与 const 一开始的定义背道而驰。

于 2013-02-01T03:21:01.693 回答