const类型指针还可以赋值?

C++语言 码拜 9年前 (2015-05-11) 1536次浏览 0个评论

在一个开源代码中看到如下内容, 有两个问题:
1. const类型的还可以赋值吗?
2. 上述形式在VS下是有错误的,那么我想在VS下编译,该如何修改

  const t_rnxObs* hlp[header.nTypes(sys)];  //主要是这个变量的赋值问题,t_rnxObs是一个结构体,有三个double型变量
for (int iTypeV3 = 0; iTypeV3 < header.nTypes(sys); iTypeV3++) { 
  hlp[iTypeV3] = 0; 			//================1.
  QString typeV3 = header.obsType(sys, iTypeV3); 
  QMapIterator<QString, t_rnxObs> itObs(rnxSat.obs); 

  // Exact match 
  // ----------- 
  while (itObs.hasNext()) { 
	itObs.next(); 
	const QString&  type   = itObs.key(); 
	const t_rnxObs& rnxObs = itObs.value(); 
	if (typeV3 == type2to3(sys, type) && rnxObs.value != 0.0) { 
	  hlp[iTypeV3] = &itObs.value(); //================2.
	} 
  } 

  // Non-Exact match 
  // --------------- 
  itObs.toFront(); 
  while (itObs.hasNext()) { 
	itObs.next(); 
	const QString&  type   = itObs.key(); 
	const t_rnxObs& rnxObs = itObs.value(); 
	if (hlp[iTypeV3] == 0 && typeV3 == type2to3(sys, type).left(2) && rnxObs.value != 0.0) { 
	  hlp[iTypeV3] = &itObs.value(); ////================3.
	} 
  } 
}  
20分
1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。
10分
你得明白:const位于*左右的差别
1.const int *p;
2.int * const p;
参看
http://blog.csdn.net/zhangxiangdavaid/article/details/38082159

它指向的地址是不让修改的。但是指针本身可以修改。
引用 1 楼 cjwloveljj 的回复:

1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。

我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];  
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改

引用 4 楼 zzwf1 的回复:
Quote: 引用 1 楼 cjwloveljj 的回复:

1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。

我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];  
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改

当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数,  所以会出现这个错误

引用 5 楼 axf1766567189 的回复:
Quote: 引用 4 楼 zzwf1 的回复:
Quote: 引用 1 楼 cjwloveljj 的回复:

1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。

我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];  
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改

当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数,  所以会出现这个错误

有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };
const指针是指地址不能修改,但是地址内存储的数据如果不是const就可以修改
引用 6 楼 zzwf1 的回复:
Quote: 引用 5 楼 axf1766567189 的回复:
Quote: 引用 4 楼 zzwf1 的回复:
Quote: 引用 1 楼 cjwloveljj 的回复:

1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。

我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];  
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改

当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数,  所以会出现这个错误

有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };

根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的. 
没有完整的代码, 只能给你分析到这里了 

10分
const位置不同表示的意思是不同的,有可能是指向的地址是常量,也可能是指向地址中的内容是常量,还可能两个都是

具体看下面:

const & 指针 
  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么? 
  1)、const在前面 
  const int nValue; //nValue是const 
  const char *pContent; //*pContent是const, pContent可变 
  const (char *) pContent;//pContent是const,*pContent可变 
  char* const pContent; //pContent是const,*pContent可变 
  const char* const pContent; //pContent和*pContent都是const 
  2)、const在后面,与上面的声明对等 
  int const nValue; // nValue是const 
  char const * pContent;// *pContent是const, pContent可变 
  (char *) const pContent;//pContent是const,*pContent可变 
  char* const pContent;// pContent是const,*pContent可变 
  char const* const pContent;// pContent和*pContent都是const 
  答案与分析: 
  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则: 
  当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。 
  另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。 
  一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。

A1.编译器只让你赋值一次,但是采用指针,能间接操纵
引用 8 楼 axf1766567189 的回复:
Quote: 引用 6 楼 zzwf1 的回复:
Quote: 引用 5 楼 axf1766567189 的回复:
Quote: 引用 4 楼 zzwf1 的回复:
Quote: 引用 1 楼 cjwloveljj 的回复:

1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。

我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];  
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改

当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数,  所以会出现这个错误

有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };

根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的. 
没有完整的代码, 只能给你分析到这里了 

 
如下编译OK的啊,检查下你定义的数组维数:

#include “stdafx.h”
class t_rnxObs{
public:
t_rnxObs(){
value = 0.0; lli = 0; snr = 0;
}
double value;
int lli;
int snr;
};

int _tmain(int argc, _TCHAR* argv[])
{
const t_rnxObs* hlp=new t_rnxObs[5]; 

return 0;
}


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明const类型指针还可以赋值?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!