0%

C++指针

常量指针

前言

C++指针有很多地方和C语言共通的,所以会忽略很多C指针基础知识,这篇最好有C指针基础再来批判

int* p1,p2;看起来像声明了两个指针,其实不是,和int *p1,p2;等价

可以用typedef语句避免这个错误,例如typedef int* intPointer,然后intPointer p1,p2;就声明了两个指针

可以对指使用比较运算符来确定指针的先后次序

 

常量指针

这个点见8.11号的做题,涉及到了

可以用const关键字声明一个常量,同样也可以用这个关键字声明指针,用于“固定”指向的位置

double radius = 5;
double* const p = &radius;
  • p是常量,但p指向的数据不是常量,是可以改变的

如果把const放在数据类型之前

const double* p = &radius

那么指向的就是常量了

当然如果两边都放

const double* const pValue = &radius

就是一个常量指针指向常量了

 

数组与指针

这一方面在C中已经很成熟了,那么就写一些容易混淆的

  • list[i]*(list+i)等价,解引用比+优先,所以*(list+i)*list+i情况不同
  • C++中数组名的实质是一个常量指针,是不能改变的
  • *p++值为arr[0]但是运行完后指向arr[1]*++p是p先加一,再解引用,++*p是先解引用再加一

 

函数内传指针与返回指针

对于

void f(int* p1,int* &p2){}//函数
    

f(q1,q2);//调用,q1,q2为指针

结果为:

  • q1传值给p1,使得指向的内容都一致,再函数内直接更改内容,使得外部内容同样遭到更改。但若更改p1的指向,那么函数外的q1其实不受影响
  • q2传引用给p2,所以q2是p2的别名,那么无论什么修改就会共同影响

 

函数返回指针:

这是一个用于反转数组的一个函数

int* reverse(int* list,int size){
    for(int i = 0;j=size - 1;i<j;i++,j--){
        int temp=list[j];
        list[j]=list[i];
        list[i]=temp;
    }
    return list;
}

 

数组函数API

  • min_elementmax_element返回数组中最小、最大元素的指针

e.g. min_element(list,list+6)返回数组中list[0],list[5]之间最小元素的指针

  • sort对数组进行排序
  • random_shuffle随机安排数组元素排序
  • find寻找匹配元素指针

 

this指针

this只能出现在类的内部,通过this可以访问类的所有成员,包括private内的。在对象创建后才有意义

#include <iostream>
using namespace std;

class Student{
public:
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
private:
char *name;
int age;
float score;
};

void Student::setname(char *name){
this->name = name;
}
void Student::setage(int age){
this->age = age;
}
void Student::setscore(float score){
this->score = score;
}
void Student::show(){
cout<<this->name<<"的年龄是"<<this->age<<",成绩是"<<this->score<<endl;
}

int main(){
Student *pstu = new Student;
pstu -> setname("李华");
pstu -> setage(16);
pstu -> setscore(96.5);
pstu -> show();

return 0;

}

其中发现,类中函数的形参与类中参数重名,这就是一种不得不使用this的情况

 

拷贝构造函数

拷贝构造函数可以用来创造一个对象,并用另一个对象的数据初始化新建对象

ClassName(const ClassName&)

和构造函数一样,C++会隐式提供一个缺省的拷贝构造函数(没有主动定义的情况下)。

如果新建一个新对象,将所有参数一个个复制过去,这个思路是和拷贝构造函数是一致的,不过拷贝构造函数会自动新建对象。

  • 浅拷贝:上述两种拷贝方式都叫浅拷贝

对于指针参数来说,浅拷贝会将指针地址也拷贝过去,所以两个对象中的指针就同时指向一个地址了,这不是我们想要的

  • 深拷贝:可以在拷贝构造函数中自定义