指针在数组对象中的基本使用与地址探讨

指针在数组对象中的基本使用与地址探讨:

这里涉及到类与对象、指针和运算符重载的一些内容:
阅读前可以参考(标星号代表重点):
*类和对象的进一步了解与使用
**指针及其应用
C++单元学习小结之指针(续),存储空间的分配策略,new和delete运算符,const限定词 结构体(续),枚举
***C++之运算符重载
需要注意的一些内容:
指针的赋值与取地址符的使用:

 	int *p = (int*)&b;  //用指针p指向地址b,即把b的地址赋值给指针p
    cout<<"指针p指向的地址:"<<&(*p)<<endl;
   *p=a.b;  //给指针p赋值,现在指针p指向的是地址b,因此也就相当于b=a.b;

运算符重载:

  A& operator=(const A &a){
        cout<<"重载"<<endl;
     	b=a.b;
        c=a.c;
        return *this;
    };

关于运算符重载可参考:
***C++之运算符重载
这一部分内容还是十分有趣的(运算符重载这个名词基本上是指C/C++,因为Java是不支持运算符重载的,程序员无法定义+ * 等运算符,没有给程序员自己重载运算符的权利。这也是考虑到Java中面向对象编程(OOP)的原则问题吧),这里给出运算符重载中关于函数调用运算符()的一些例子:
例一:

//本例参考自菜鸟教程:https://www.runoob.com/cplusplus/function-call-operator-overloading.html
#include <iostream>
using namespace std;

class Distance
{
   private:
      int feet;             // 0 到无穷
      int inches;           // 0 到 12
   public:
      // 所需的构造函数
      Distance(){
         feet = 10;
         inches = 20;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      // 重载函数调用运算符
      Distance operator()(int a, int b, int c)
      {
         Distance D;  //定义一个Distance 调用默认构造函数进行初始化,此时feet=10,inches=20;
         cout<<"重载:	 D.displayDistance(): 	";
         D.displayDistance();
         // 进行随机计算(重新赋值)
         D.feet = a + c + 10;
         D.inches = b + c + 100 ;
         return D;
      }
      // 显示距离的方法
      void displayDistance()
      {
         cout << "F: " << feet <<  " I:" <<  inches << endl;
      }

};
int main()
{
   Distance D1(11, 10), D2;

   cout << "First Distance : ";
   D1.displayDistance();

   D2 = D1(10, 10, 10); // invoke operator()
   cout << "Second Distance :";
   D2.displayDistance();

   return 0;
}

例二:

#include <iostream>
using namespace std;
//带状态的函数对象,设定不同的输出流对象和分隔符
class PrintString{
	ostream &os;
	char sep;
public:
	PrintString(ostream &o = cout, char c = '	')
: os(o), sep(c){}
	void operator()(const string& str){os << str << sep; }
};
int main(){
	PrintString welcomeMsg;
	welcomeMsg("Welcome!");
	PrintString errMsg(cerr, '
');
	errMsg("Error!");
	errMsg("Error!");
	return 0;
}

在这里插入图片描述

指针在数组对象中的基本使用与地址探讨:

#include<iostream>
#include<stdio.h>
using namespace std;
class A{
    const int b;
    int c;
public:
    A():b(0){/*cout<<"调用默认构造函数"<<endl;*/};
    A(int b1,int c1):b(b1),c(c1){};
    void show(){
        cout<<b<<"  "<<c<<endl;
    }

    A& operator=(const A &a){
        cout<<"重载"<<endl;
        cout<<"b的地址:"<<&b<<endl;
        int *p = (int*)&b;  //用指针p指向地址b,即把b的地址赋值给指针p
        cout<<"指针p指向的地址:"<<&(*p)<<endl;
        *p=a.b;  //给指针p赋值,现在指针p指向的是地址b,因此也就相当于b=a.b;
        //b=a.b;
        c=a.c;
        return *this;
    };

};

//A *a[100];  //没有调用默认构造函数,只是以指针的方式存在
A a[100];  //调用默认构造函数,以默认对象存在
int main(){
    /*
    const int i=2;
    cout<<&i<<endl;
    int *p = (int*)&i;
    cout<<&(*p)<<endl;
    *p=10;
    cout<<i<<endl;
    */

    /*
    A a1 = A(100);
    a[0]=&a1;
    (*a[0]).show();
    */
    //A a0 = A(i+100,i+120);  //如果这样定义那么是直接调用构造函数,没有重载
    A a0;  //这样定义调用默认构造函数,如果对该默认对象a0作出重新赋值修改则调用重载构造函数:a0 = A(i+100,i+120);
    for(int i=0;i<10;i++){
        a0 = A(i+100,i+120);
        a[i]=a0;
        a[i].show();
    }
     return 0;
}

result:
在这里插入图片描述
同时应注意地址内容:
在这里插入图片描述

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/study-hard-forever/p/14387290.html