C++学习笔记之"类和对象II"
指向类成员的指针
#include <iostream>
class A
{
public:
A(int i) {a=i;}
int fun(int b) {return a*c+b;}
int c;private:
int a;
};
void main()
{
A x(8);
int A::*pc;//指向类的数据成员的指针pc
pc=&A::c;
x.*pc=3;//通过指针对数据成员c赋值
int (A::*pfun)(int);//指向类的函数成员的指针pfun
pfun=&A::fun;
A *p=&x;//注意是相同的类
cout<<(p->*pfun)(5)<<endl;//通过指向对象的指针p调用指向成员函数的指针pfun,(p->*pfun)(5)等价于p->fun(5)等价于(x.*pfun)(5)
}
对象指针和对象引用做函数参数
对象指针作函数参数
#include <iostream>
class M
{
public:
M(){x=y=0;}
M(int i,int j){x=i;y=j;}
void copy(M *m);
void setxy(int i,int j){x=i;y=j;}
void print(){cout<<x<<","<<y<<endl;}
private:
int x,y;
};
void M::copy(M *m)//形参是指向对象的指针
{
x=m->x;
y=m->y;
}
void fun1(M m1,M *m2);
void main()
{
M p(5,7),q;
q.copy(&p);//实参是某个对象的地址值
fun1(p,&q);
p.print();
q.print();
}
void fun1(M m1,M *m2)
{
m1.setxy(12,15);//形参对象值改变了,实参对象值并没有改变
m2->setxy(22,25);//指向对象的指针作参数所指向的对象的值改变了
}
对象引用作函数参数
应用比对象指针作函数参数更普遍
#include <iostream>
class M
{
public:
M(){x=y=0;}
M(int i,int j){x=i;y=j;}
void copy(M &m);
void setxy(int i,int j){x=i;y=j;}
void print(){cout<<x<<","<<y<<endl;}
private:
int x,y;
};
void M::copy(M &m)//形参是对象的引用
{
x=m.x;
y=m.y;
}
void fun1(M m1,M &m2);
void main()
{
M p(5,7),q;
q.copy(p);//实参是某个对象
fun1(p,q);
p.print();
q.print();
}
void fun1(M m1,M &m2)
{
m1.setxy(12,15);//形参对象值改变了,实参对象值并没有改变
m2.setxy(22,25);//对象引用作参数所引用的对象的值改变了
}
this 指针
一个隐含于每一个类成员函数中的特殊指针,指向一个正在被某个成员函数操作的对象的指针
#include <iostream>
class M
{
public:
M(){x=y=0;}
M(int i,int j){x=i;y=j;}
void copy(M &m);
void print(){cout<<x<<","<<y<<endl;}
private:
int x,y;
};
void M::copy(M &m)//形参是对象的引用
{
if (this==&m) return;//this是操作该成员函数的对象的地址
*this=m;//*this操作该成员函数的对象
}
void main()
{
M p(5,7),q;
q.copy(p);
p.print();
}
指向数组的指针和指针数组
指向数组的指针
#include <iostream>
class M
{
public:
M(){x=y=0;}
M(int i,int j){x=i;y=j;}
void print(){cout<<x<<","<<y<<endl;}
private:
int x,y;
};
void main()
{
M m[2][4];
int x=10,y=10;
for(int i=0;i<2;i++)
{
for(int j=0;j<4;j++)
{
m[i][j] = M(x+=2,y+=10);
}
}
//for(int i=0;i<2;i++)
// {
// cout<<endl;
//for(int j=0;j<4;j++)
//m[i][j].print();
//}
// cout<<endl;
M (*pm)[4](m);//定义一个一维对象数组的指针pm,指向2维对象数组m
for(int i=0;i<2;i++)
{
cout<<endl;
for(int j=0;j<4;j++)
(*(*(pm+i)+j)).print();
}
cout<<endl;
}
指针数组
#include <iostream>
#include <string>
const int N=5;
void main()
{
char *strings[N];//字符指针数组,可以用来存放N个字符串
char str[80];
cout<<"At each prompt ,enter a string:\n";
for(int i=0;i<N;i++)
{
cout<<"Enter a string #"<<i<<":";
cin.getline(str,sizeof(str));//从键盘上一次获取字符串,sizeof(str)给出str数组所占的内存空间字节数
strings[i]=new char[strlen(str)-1];//给某个指针动态地分配一个内存地址
strcpy(strings[i],str);
}
cout<<endl;
for(int i=0;i<N;i++)
cout<<"string #"<<i<<":"<<strings[i]<<endl;
}
posted on 2010-07-25 18:33 CrazeCoder 阅读(266) 评论(0) 收藏 举报
浙公网安备 33010602011771号