C++中操作符学习笔记

1.指针操作符 “.” 和 “- >” 的区别

首先说明堆栈的概念,

:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(压栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。

:是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。

一般说到内存,指的是计算机的随机储存器(RAM),程序都在这里面运行。

栈内存:由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。若分配失败,则提示栈溢出错误。注意,const局部变量也储存在栈区内。

堆内存:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。分配的速度较慢,地址不连续,容易碎片化。此外,由程序员申请,同时也必须由程序员负责销毁,否则则导致内存泄露。

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

理解了堆栈,就很容易理解操作符了。

  • 操作符 “.” 用于操作静态创建的类对象,此类对象创建于中,返回的是对象的实例。
  • 操作符 “- >” 用于操作动态创建的类对象,此类对象创建于中,返回的不是对象的实例,而是指向对象的指针。

举个例子:

TDate date1;
TDate date2 = new TDate();
//若TDate类中有一个成员为 int x
date1.x = 100;
date2 -> x = 100;
//使用完之后
delete data2;

第一种创建对象date1的方式属于静态创建方式,类似于int i = 0; 这种最一般的创建方式,返回的是一个TDate型的对象实例。
第二种创建对象date2的方式属于动态创建方式,创建的是一个指向TDate型对象的指针,也就是说,new操作符返回的是一个指针,这个指针指向一个对象实例。这和java或者js或c#不一样,new出来的就直接是对象,因为这些语言中没有指针。所以c++中new出来的对象必须手动delete掉,否则其内存不会自动释放。c++中的new相当于C中的mallon(),而delete相当于C中的free()。

2.操作符 “::” 的作用

操作符 “::” 在C++中表示作用域,所属关系。

  • 表示作用域时,作为全局作用域符号,当全局变量在局部函数中与其中某个变量重名,那么就可以用 “::” 来区分,例如:
int zhang = 0; //全局变量

void deal() {
int zhang = 1; //局部变量
int zhang = int zhang + ::int zhang; 
}
  • 表示类中成员,例如:A表示一个类,A中有一个成员member,那么A::member就表示为类A中的成员member。
  • 作用域分解运算符,比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f()的定义,那么在类外定义f()时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如:
class zhang {
public:
	int var;
	int add(int a, int b);
	int add(int c);
}

int zhang::add(int a, int b) {
return a + b;
}

int zhang::add(int c) {
return c + ::var;
}

3.多级指针操作符 " ** "

所谓的多级指针,就是一个指向指针的指针,比如:

char *p = "My name is zhang yudong";
char **pp = &p;  //二级指针
char ***ppp = &pp; //三级指针
  • 多级指针通常用来作为函数的形参,比如常见的main函数声明如下:
int main(int argc,char ** argv);

因为当数组用作函数的形参的时候,会退化为指针来处理,所以上面的形式和下面是一样的。

 int main(int argc,char* argv[]);

argv用于接收用户输入的命令参数,这些参数会以字符串数组的形式传入,类似于:

char * parm[] = {"parm1","parm2","parm3","parm4"};//模拟用户传入的参数
main(sizeof(parm)/sizeof(char *),parm);//模拟调用main函数,实际中main函数是由入口函数调用的
  • 多级指针的另一种常见用法是,假设用户想调用一个函数分配一段内存,那么分配的内存地址可以有两种方式拿到:第一种是通过函数的返回值,该种方式的函数声明如下:
void * get_memery(int size)
    {
       void *p = malloc(size);
       return p;
     }

第二种获取地址的方法是使用二级指针,代码如下:

int get_memery(int** buf,int size)
    { 
      *buf = (int *)malloc(size);
      if(*buf == NULL)
          return -1;
      else
          return 0;
    }
     int *p = NULL;
     get_memery(&p,10);
  • 用三级指针定义一个三维数组
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int height, row, col;  //依次为三维数组的高、行、列
    cout << "请输入三维数组高,行,列 : ";
    cin >> height >> row >> col;
    int i, j, k;
//动态定义三维数组
    int ***p;
    p = new int**[height];
    for(i=0;i<height;i++)
    {
        p[i] = new int*[row];
    }
    for(i=0;i<height;i++)
    {
        for(j=0;j<row;j++)
        {
            p[i][j] = new int[col];
        }
    }
//输入三维数组
    printf("请输入%d个元素:\n",height*row*col);
    for(i=0;i<height;i++)
    {
        for(j=0;j<row;j++)
        {
            for(k=0;k<col;k++)
            {
                cin >> *(*(*(p+i)+j)+k);
            }
        }
    }
//输出三维数组
    for(i=0;i<height;i++)
    {
        for(j=0;j<row;j++)
        {
            for(k=0;k<col;k++)
            {
                cout << p[i][j][k] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }
    delete []p; //释放内存空间
    return 0;
}

4. C++中运算符

算术运算符
算术运算符
关系运算符
关系运算符
逻辑运算符
在这里插入图片描述
位运算符
在这里插入图片描述
赋值运算符
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值