Day 2
对象指针
指向对象的指针,通过指针访问对象的函数
ptr->getx() 就相当于(*ptr).get()
如:
#include<iostream>
using namespace std;
class point {
public:
point(int a,int b){
x=a;
y=b;
}
int getx(){
return x;
}
int gety(){
return y;
}
private:
int x,y;
};
int main(){
point a(4,1);
point *ptr=&a;//定义一个对象指针,用a的地址初始化
cout<<ptr->getx()<<endl;//用指针访问对象成员
cout<<a.getx()<<endl;//通过对象访问对象成员
return 0;
}
上述两种访问方式的输出的结果一致,都为4。
this指针
隐含在每个非静态成员函数中,指出成员函数所操作的对象
#include<iostream>
using namespace std;
class Box{
public:
Box(int a,int b,int c){
length = a;
wide = b;
height = c;
}
int volume(){
return height*length*wide;
}
int compare(Box box){
return this->volume()>box.volume();
}
private:
int height,length,wide;
};
int main(){
Box box1(1,2,3);
Box box2(1,3,4);
if(box1.compare(box2)){ //this指向的box1的成员函数volume
cout<<"the volume of box1 is bigger" <<endl;
}
else{
cout<<"the volume of box2 is bigger" <<endl;
}
return 0;
}
动态分配和释放内存
new/delete 对象名 即可
分配和释放动态数组:
分配 new 类型名 T [数组长度] ,数组长度可以是任何整数类型表达式,也可以在运行时计算得到
释放 delete [] 数组名 T 释放指针指向的数组, T必须是new得到的数组
比如:
#include<iostream>
using namespace std;
class point{
public:
int getx(){
return 0;
}
private:
};
int main(){
point *ptr = new point[2];//分创建对象分配动态数组
ptr[0].getx();//采用数组指针的方式调用对象数组的成员函数,ptr是指针,ptr[0]是数组对象中的第一个对象
ptr[1].getx();
delete [] ptr ;//删除整个数组
return 0;
}
注意:delete后不加"[]” 则只会删除第一个数组对象,不会删除整个数组
分配和创建多维数组
new 类型名 T [第一维长度] [第二维长度] [第三维长度]…(如果内存分配成功,则new运算返回一个指向新分配空间首地址的指针)
如果是一维数组,指针指向数组元素,指针+1时,以行的形式遍历数组,因此new 一个一维数组后返回一维数组的首地址
如果是多维数组,指针指向的仍是数组,比如一个二维数组的首地址是指向一维数组的指针,即指向行的指针,指针+1时,以列的形式遍历数组
比如: int (*ptr)[3] = new int [2][3]
比如: int (*ptr)[9][8] = new int [7][9][8]
动态数组类
构造函数通过new动态分配地址生成一个数组,再在构析函数中进行delete释放内存。
vector对象
为什么需要vector对象?
因为vector类封装了任何类型的动态数组,自动创建和删除,同时还能进行数组下标越界检查。
vector对象的定义:vector<元素类型>数组对象(数组长度);
例如:vector< int > array(5) //建立一个大小为5的int类型的动态数组
vector对象特性:对数组元素的引用与普通数组具有相同的形式。如:vector 对象名[]
获取数组的长度可以用size函数,如vector 对象名.size()*
注意:vector数组对象不表示数组的首地址
#include<iostream>
#include<vector>
using namespace std;
double average(const vector<double>&array){
double sum=0;
for(int i=0;i<array.size();i++)
sum+=array[i];
return sum/array.size();
}
int main(){
int n;
cout<<"please input the length of array:"<<endl;
cin>>n;
vector<double>array(n);//创建double类型的动态数组
for (int i=0;i<n;i++){
cin>>array[i];
}
cout<<"the average array is "<<average(array)<<endl;
return 0;
}
//创建动态数组,并调用size()等函数进行功能实现
c++11中还存在智能指针
1.unique_ptr:不允许多个指针共享资源,即该地址智能用这个指针访问资源,其他的不允许访问,但该指针可以用标准库中的move函数进行移动,但是一经移动,该指针就不再是unique指针了。
2.shared_ptr:多个指针共享资源,即多个指针可以指向同一个内存单元
3.weak_ptr:可复制shared_ptr,但其构造或者释放对资源不产生影响。
每日一题
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
限制:
1 <= k < s.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1、
class Solution {
public:
string reverseLeftWords(string s, int n) {
return s.substr(n,s.size())+s.substr(0,n);
}
};
class Solution {
public:
string reverseLeftWords(string s, int n) {
return (s+s).substr(n,s.size());
}
};
今日份小知识
在for( ; ; i++) 或者 for( ; ; ++i)的时候是没有区别的,区别在于i++ 和 ++i 的执行顺序是不一样的
比如
i = 1;
a = i++;
b = ++i;
那么a = 1 b = 2
因为a是先让i把值给a之后让i自增,而b是让i先自增再把i的值给b的
引用调用
c++向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
按引用传递值,参数引用被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为引用类型,该函数用于交换参数所指向的两个整数变量的值。
https://www.runoob.com/cplusplus/cpp-function-call-by-reference.html