1.顶层const和底层const

 const int a=10;

 int b=5;

 const int *p1=&a;

 int (*const)p2=&b;

  

p1是顶层const,表示p1是一个指向常量的指针,不能用修改(*p1)的值,p2是底层const,表示p2是一个常量指针,即不能改变p2的值。

2.类成员函数参数列表后面为什么要加const?

例如定义一个表示平面点的类。

struct zz

{

  int x,y;

     bool operator <(const zz&u)const

  {

    return x<u.x;
  } }

  

调用重载的<时,实际上是隐式的使用了this指针,this指向<前面的对象,且是常量指针,这样this就无法绑定到一个常量上,为了增加程序的灵活性,将this变为一个指向常量的常量指针,这样无论<前面是不是常量都能顺利的绑定上去。如果加了const则不能改变<前面的对象的值。

3.指向函数的指针

首先要弄清楚函数的类型,函数类型由函数的返回类型和函数的参数列表确定,并且是精确匹配。

比如int Add(int a,int b)它的类型就是int (int ,int),而int *(int ,int )就表示指向函数的指针。

定义:

  int Add(int a,int b);
int (*p)(int ,int);
  decltype(Add)p1;
p=Add;
  
  

  p表示的就是指向函数Add的指针,相当于是函数的另一个名字,可以像调用add一样调用p。p1和p的定义等价。

下面是一个用vector储存并调用函数指针的例子:

#include<iostream>
#include<cassert>
#include<string>
#include<vector>
using namespace std;
int main()
{
int f(int,int);
int jia(int ,int);
int jian(int ,int);
int cheng(int ,int);
int chu(int,int);
vector<decltype(f)*>s1;
vector<int(*)(int ,int)>s2;
s2.push_back(jia);
s2.push_back(jian);
s2.push_back(cheng);
s2.push_back(chu);
int a,b;
cin>>a>>b;
for(auto c:s2)
cout<<c(a,b)<<endl;
}
int jia(int a,int b)
{
return a+b;
}
int jian(int a,int b)
{
return a-b;
}
int cheng(int a,int b)
{
return a*b;
}
int chu(int a,int b)
{
return a/b;
}

4.函数类型后置

对于一些类型比较复杂的函数,可以使用函数类型后置。

     int a[5]={1,2,3,4,5};
auto func(const int &i) -> int (&)[5];

 这里,func返回的是数组的引用,即它返回的值等价于数组。

#include<iostream>
using namespace std;
int main()
{
int Add(int ,int);
auto p(int) ->int(*)(int ,int);
}

 这里,p返回的是一个指向函数的指针。

5.数组作为形参

有两种方法实现

(1):传入指针

#include<iostream>
using namespace std;
int a[5],b[5];
int main()
{
int print(int [],int);
print(a,5);
}
void print(int p[],int len)
{
for(int i=0;i<len;i++)
cout<<*(p+i)<<' ';
}

 这里把数组的首地址传进了函数中,int []可以替换成int *,同时需要传入数组的大小,防止越界。

(2):传入数组的引用

#include<iostream>
using namespace std;
int a[5],b[5];
int main()
{
int print(int (&)[5]);
print(a);
}
void print(int (&p)[5])
{
for(auto c:p)
cout<<c<<' ';
}

 这里把数组的引用作为参数传递了进去,此时的p就相当于a,注意数组类型里包含了数组的大小,用这种方法必须表明数组的大小。

6.定义接口函数读入(输出)自定义类类型

#include<bits/stdc++.h>
using namespace std;
struct Sales_data
{
string isbn()const{return bookNo;}
Sales_data& combine(const Sales_data &other)
{
revenue+=other.revenue;
units_sold+=other.units_sold;
return *this;
}
string bookNo;
double revenue=0.0;
int units_sold=0;
double price=0.0;
};
istream &read(istream &is,Sales_data& item)
{
is>>item.bookNo>>item.units_sold>>item.price;
item.revenue=item.price*item.units_sold;
return is;
}
ostream &print(ostream &os,const Sales_data &item)
{
os<<item.bookNo<<' '<<item.units_sold<<' '<<item.revenue;
return os;
}
Sales_data add(const Sales_data&a1,const Sales_data&a2)
{
Sales_data sum=a1;
sum.combine(a2);
return sum;
}
int main()
{
Sales_data b1,b2;
read(cin,b1);
read(cin,b2);
print(cout,add(b1,b2));
}

 istream和ostream属于IO类型,且IO类型不能拷贝,所以只能定义成引用类型。

read函数里面Sales_data不能定义成常量引用,因为要对它进行修改,return is是因为要检查是否读到了文件尾。

print函数因为不用修改Sales_data,所以可以定义成常量引用。

C++重难点知识的更多相关文章

  1. 老猿Python重难点知识博文汇总

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 除了相关教程外,老猿在学习过程中还写了大量的学习随笔,内容比较杂,文章内容也参差不齐,为了方便,老猿 ...

  2. html和css的重难点知识

    目录 html总难点总结: 1. 块级标签与内联标签的区别 1.1 块级标签: 1.2 内联标签: 2. 选择器 2.1 定义 2.2 选择器的分类 2.1 选择器的分类 3. css中margin, ...

  3. Android 相关重难点知识整理

    [原文] 集合 对 HashMap 进行排序: HashMap 本身无序,但其子类 LinkedHashMap 使用链表结构,实现了有序.通过 HashMap#entrySet() 方法可以将 Map ...

  4. English--音标重难点

    English|音标重难点 在拥有了,音标的元音与辅音的基础之后,需要对于这些音标进行加以区分,毕竟方言对于口型的影响非常的大. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

  5. 这是一份非常适合收藏的Android进阶/面试重难点整理

    写在前面 记得我大二时“不务正业”地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并且不够深入,遇到瓶颈 ...

  6. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  7. 李洪强漫谈iOS开发[C语言-008]- C语言重难点

      C语言学习的重难点 写程序的三个境界: 照抄的境界,翻译的境界,创新的境界 1  伪代码: 描述C语言的编程范式 范式: 规范的一种表示 对于C的范式学会的话,C, C++ Java 都会了 2 ...

  8. 《十天学会 PHP》的重难点

    记录一下我在学习<十天学会 PHP>(第六版)的过程中的遇到的重难点,该课程是学习制作一个简单的留言板. 准备工作 XAMPP(Apache + MySQL + PHP + PERL) 是 ...

  9. 作为程序员必须掌握的Java虚拟机中的22个重难点

    Java虚拟机一直是比较重要的知识点,是Java高级开发必会的.本文为你总结了关于JVM的22个重点.难点,图文并茂的向你展示和JVM有关的重点知识.全文共7000字左右. 概念 虚拟机:指以软件的方 ...

随机推荐

  1. tttt

    while(scanf("%d",&n)!=EOF) { res=-1; level(tmp,n,res,1); printf("%d/n",res); ...

  2. Spring AOP之异常转换

    Spring-AOP之异常转换 引子 最近项目遇到了一个问题,就是说业务层向展现层需要转换成统一个异常类,并抛出异常,但是由于业务层的异常类过多,所以导致业务异常转换代码充斥着异常转换的代码,本着程序 ...

  3. 在js中使用json

    在js中使用json var obj = {     "1" : "value1",     "2" : "value2" ...

  4. Kendo Web UI Grid里时间格式转换

    我和大家分享一下我的kendo的学习心得.如果不好的地方多多包含或者给我留言请看图 kendo里时间格式如图Oder Date列里的格式.但是我们想把时间转换成中国人习惯的格式.如Shipped Da ...

  5. Java根据字节数据判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  6. python计算机视觉1:基本操作与直方图

    本文主要内容来源于书籍<python计算机视觉编程> 我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢 PIL模块 PIL模块全程为Python Imaging Library,是 ...

  7. ASP.NET MVC DefaultModelBinder

    转载自 Leo‘s Blog 看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的 ...

  8. 动态修改ActionBar Menu的显示

    应用场景: 在主Activity中,采用InstrumentedActivity侧边栏的方式,侧边栏的每一项对应一个Fragment,要实现不同的Fragment动态显示与隐藏ActionBar Me ...

  9. jquery使用总结

    jquery使用总结-常用DOM操作 (1)查询或设置元素属性操作 html()   //获取匹配元素集合中的第1个元素 html(htmlString)  //为匹配集合中的所有元素设置内容 tex ...

  10. UML建模工具-火龙果软件

     官网地址:http://code.uml.com.cn/index.asp     Bridge桥梁模式    (待逆向) 桥梁模式,通过增加一个类,将抽象部分与它的实现部分分离,使它们都可以独立 ...