指针在数组对象中的基本使用与地址探讨:
这里涉及到类与对象、指针和运算符重载的一些内容:
阅读前可以参考(标星号代表重点):
*类和对象的进一步了解与使用
**指针及其应用
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<<"重载:\t D.displayDistance(): \t";
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 = '\t')
: os(o), sep(c){
}
void operator()(const string& str){
os << str << sep; }
};
int main(){
PrintString welcomeMsg;
welcomeMsg("Welcome!");
PrintString errMsg(cerr, '\n');
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:
同时应注意地址内容: