C++语言99个常见编程错误 常见错误:5:对引用的认识误区

 对于引用的使用,主要存在两个常见的问题。首先,容易与指针搞混。其次,它们未被充分
利用。好多在C++工程使用的指针实际上只是C阵营那些老顽固的杰作,该是引用翻身的时候了。
  引用并非指针。引用只是其初始化物的别名。能对引用做的唯一操作就是将其初始化。一旦
初始化结束,引用就是器初始化物的另一种写法罢了。
  任何能作为左值的复杂表达式都能作为引用的初始化物。
  指向数组的引用保留了数组的尺寸信息,而指针则不保留。
  没有转换成引用类型的强制类型转换操作的一次复制尝试则会无可挽回地失败,强制类型转换
的结果是右值而不是左值。


  指向数组的引用保留了数组尺寸信息,而指针则不保留


main.cpp
#include <iostream>
#include <string>
#include "array.h"

template <typename A>
void print( const A &a, int n ) {
	using namespace std;
	cout << "[ ";
	for( int i = 0; i < n; ++i )
		cout << a[i] << " ";
	cout << ']' << endl;
}

int main() {
	Array<int,12> ia;
	ia = 7;
	print( ia, 12 );
	ia[8] = ia[0] = 2;
	ia[3] = ia[0];
	print( ia, 12 );
	ia = 0;
	print( ia,12 );
	ia.setAll( -1 );
	print( ia, 12 );
	
	Array<std::string,5> sa;
	sa = "Dorian";
	print( sa, 5 );
	sa[4] = sa[0] = "Edgar";
	sa[3] = sa[0];
	print( sa, 5 );
	sa = "Annabel";
	print( sa,5 );
	getchar();
	
	return 0;
}

array.h
#ifndef ARRAY_H
#define ARRAY_H

template <typename T, int n>
class Array {
  public:
    T &operator [](int i)
        { return a_[i]; }
    const T &operator [](int i) const
        { return a_[i]; }
    bool operator ==( const Array &rhs ) const;
    bool operator !=( const Array &rhs ) const
    	{ return !(*this==rhs); }
    Array &operator =( const T & );
    void setAll( const T & );
  private:
    T a_[n];
};

template <class T, int n>
bool Array<T,n>::operator ==( const Array &rhs ) const {
    for( int i = 0; i < n; ++i )
        if( a_[i] != rhs.a_[i] )
            return false;
    return true;
}

template <class T, int n>
Array<T,n> &Array<T,n>::operator =( const T &val ) {
    for( int i = 0; i < n; ++i )
        a_[i] = val;
    return *this;
}

template<class T, int n>
void Array<T,n>::setAll( const T &val )
	{ *this = val; }

#endif


输出
[ 7 7 7 7 7 7 7 7 7 7 7 7 ]
[ 2 7 7 2 7 7 7 7 2 7 7 7 ]
[ 0 0 0 0 0 0 0 0 0 0 0 0 ]
[ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ]
[ Dorian Dorian Dorian Dorian Dorian ]
[ Edgar Dorian Dorian Edgar Edgar ]
[ Annabel Annabel Annabel Annabel Annabel ]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值