C++ 中const总结

所需积分/C币:9 2012-11-17 21:01:47 155KB PDF

C++ 中const总结 const 限定符把一个对象转换成一个常量,如 const int bufSize=512; 申 明 bufSize 的时候,如果不将它初始化,那么编译器会报错:const object must be initialized if not extern。因为 bufSize 被 const 限定符限制,如果不在 申明 bufSize 的时候给它赋值,就不能再给它赋值(因为常量在定义之后就不能 被修改),它就没有任何意义了。 下面将详细的讨论一下 const 变量的作用域、const 指针、指向 const 对象的指 针、const 引用的相关用法。
C++笔记.txt 15. streams ize gcount:输入流,返回上一次被读入的字符的数目 16. vector操作: 1)[]按下标取元素,用这种方法访问的时候,不检查越界 2)at(n)和[]一样,但是检查越界,并抛出out- of-range异常 3) capacity:该 vector目前的空间能放的元素个数 reserve: 指定新容量 17. Deque是特殊的 Vector,没有 capacity和 reserve的操作,但是它增加了其它两个操作 push-front(data):从前面插入数据 pop-front:从前面删除数据 18.关联容器:map\ multimap\setⅧ multiset map:每一个元素是一个key, value>对2key是唯一的,可以是任意类型 在关联器中,只有皿ap重载了[运算符 mult imap;:key值可以不唯一,所以也不支持]运算符 set:只有key的集合,以数值为key,不允许有重复的数值,重复的插入会被忽略 multiset:允许有重复的set 20#define S(x 4*x*x+1 ma 1n int 1=6, 1=8 printf("%d\n", s(i+j)) 结果:81 S(x)=4*i+j*i+j+1=81 21.写一个"标准"宏MIN,这个宏输入两个参数并返回较小的那个 define MiN(A, B) (A<=? A: B) 22.可以将C风格的字符串转化成 string类型的字符韦 但是不能将 string类型的字符串转化成C类型的 例如;char嶂str; string strstr strstr=str;//正确 str= strstr;//错误 初始化一个C风格的字符串,并用 string类型为它初始化 const char* strsec=strstd. c-stro; 23.如果要初始化指针,需要为其赋值一个变量的地址,而不是变量的值 阻.对于指针的算术远算,等于为指针包含的内容的地址增加该指针所指对象的长 度的倍数的大小 b.如果有指针指向动态内存,要写三大函数:1)析枸2)拷贝枸造函数3)赋 值运算符函数 24.如果要使 cons t指针变量指向不同的值,可以把变量的地址赋给指针变量 第3页 C++笔记.txt 指针常量例 int a=4.b=5 int cons t*p=&a;//常量指针,但是指针指向的变量使可变的 米*=&b;//错误,指针变量使常量,不能改变其内存地址***** 25.引用: .同一个变量的别名 b.引用一旦被定义,就不能指向其他对象,必须要初始化 C.引用必须指向同一个对象 //形参总是引用,总是加 cons t保护 d.不能定义一个数组的引用,因为数组是由2若干元素组成的集合,无法建立一个 数组的别名。 e.要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变, 应使用常引用。 f.引用型参数能被定义成 cons t类型,尽量定义成 cons t g.要以引用作为返回值,必须要在函数名前加& h用引用作为函数返回值的最大好处是在内存中不产生返回值的副本 i.一个基类的引用可以指向它的派生类的实例 26.如果基类要调用子类的函数时(自己没有的函数对象),必须要把基类的地址先赋给 基类,再显示的对基类的指针进行类型转换,例如: CSha pe=& crect ((CRect*)CShape)->size o 27. riend友元的声名必须在类的内部。 友元不光可以使某个函数,还可以是某个类 28.一个类允许开放,不许修改 每个类都有自己的数据成员,各自互不千涉 C+中,同一个累中所有对象都可以共用静态数据成员(属于类 在静态成员中没有当前对象(this指针),所以只能访问静态成员,非静态成员 函数可以访问静态成员对象 静态数据成员的初始化放到类的外面 29. delete nuli什么也不会发生,new/ delete会自动调用构造/析构函数 30.做运算符操作时,尽量用前++/-,因为后+/-多做了一些操作 类型转换运算符只能是成员函数 是双目运算符,=/0运算符只能是成员函数 31.虚函数首先是一个成员函数 虚函数的成员对象占四个字节,因为一个虚函数指针占四个字节 虛函数的构造值函数,由最底层子类直接传递 凡有虚函数的类,都有一个虚函数表,每个对象都有一个虚函数指针指向这个虚 函数表 第4页 C++笔记.txt 32.多重继承和虚继承: 多重继承:一个类继承了多个类 33.多态 必须是虚函数,通过基类的指针去调用虚函数,每个类都有一个虚函数表 定义了一个方法而不去实现它叫做纯虚函数,这样的类叫抽象类 抽象类 只能是基类 不允许用抽象类来创建对象(既不能传递参数),但是可以创建抽象类的引用或 者指针 非虚函数:不希望子类改写 虚函数:父类提供了一个缺省实现子类改写父类 纯虚函数:子类必须改写父类的函数 34. typeid在运行时进行类型识别 黑盒测试 测试方法主要有:等价类划分、边值分析、因果图、错误推测等,主要用于软件确认 白盒测试 方法 API的三大模块:GDI、USER、 KERNE1 穿囚衣的小孩 2010-3-22礼拜一指针 函数指针是指向函数的指针变量 第5页 C++笔记。txt 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指 针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每 一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指 针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这 些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法 为 数据类型标志符(指针变量名)(形参列表); 注1:“函数类型”说明函数的返回类型,由于“0”的优先级高于“*”,所以指针变 量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。 例 int func(intx);/*声明一个函数* int(*f)(intx);/*声明一个函数指针· f-func;/*将func函数的首地址赋给指针f* 赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值 以后,指针f就指向函数func(x)的代码的首地址 注2:函数括号中的形参可有可无,视情况而定 下面的程序说明了函数指针调用函数的方法: 例 #include<stdio. h> int max (int x, int y) return(x>y? x: y); vold ma 1n 0 int (*ptr)(int, int) int a b p tr=max, scanf("%d, %d", &a, &b) )(a,b) printf("a=‰d,’b=%d,max=x%d",a,b,c) 口地址赋给ptr,以后就可以用p来调用该函数,实际上pt和mx都指向同一个入口地 ptr是指向函数的指针变量,所以可把函数max0赋给ptr作为ptr的值,即把max0 怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用 它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有艹和--运算,用 时要小心。 不过,在某些编译器中这是不能通过的。这个例子的补充如下 应该是这样的: 1.定义函数指针类型: typedef int (*fun-ptr)(int, int) 2.中明变量,赋值: fun-ptr max-func=max 也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。 例二、 includes tdio. h> void FileFunc o printf("FileFunc\n") void Edit Func o printf ("EditFunc \n void main o void (=funcp)O funcp=fileFunc, 第6页 C++笔记.txt 0 *funcp)0: funcp=Edit, (*funcp. )0 [编辑本段]指针函数和函数指针的区别 1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道 函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类 型的指针。 其定义格式如下所示 返回类型标识符*返回名称(形式参数表) 【函数体} 区回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实 上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址 相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不 过这时的变量是函数本身而已,而整个函数相当于一个“交量”。例如下面一个返回指针 函数的例子: finc ludesiostream> us ing namespace stds void main o float *find(float (*pionter)[4], int n) static float score[][4]=({60,70,80,90},{56,89,34,45},{34,23,56,45}} float * p; int i. ms cout<<"Enter the number to be found: cin>>m, =find (score, m) or(i=0;i<4;i++) couL<<""<<本(p+i); float*find( float(* pionter)[4],intn)/*定义指针函数*/ f1oat嶂pt; pt=*(pionter+n) return (pt) 学生学号从0号算起,函数find0被定义为指针函数,起形参 pointe是指针指向包含4 个元素的一维数组的指针变量。 pointer+1指向 score的第一行。*( pointer+1)指向第一行 的第0个元素。pt是一个指针变量,它指向浮点型变量。main0函数中调用find0函数,将 score数组的首地址传给 pointer 2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量, 只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这 里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函 数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用 指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函 数和做函数的参数。 函数指针的说明方法为 数据类型标志符(*指针变量名)(参数); 注1:函数括号中的参数可有可无,视情况而定。下面的程序说明了函数指针调用函数 的方法: include int max(int x, int y)t return(x>y? x: y); y void maino int ptr)o int a, bc 第7页 C++笔记.txt ptr=max scanr("‰d,‰d",&a,&b); c= ptr)(a, b) printf("a=%d, b=%d, max=%d",a, b, c) bDt是指向函数的指针变量,所以可把函数maxO赋给ptr作为tr的值,即把maxQ的入 址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和m阻x都指向同一个入口地址 不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像 怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用 它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有艹和--运算,用 时要小心 [编辑本段]关于函数指针数组的定义 关于函数指针数组的定义方法,有两种;一种是标准的方法;一种是蒙骗法 第一种,标准方法: 分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是 是一个数组,且其元素是一个指向函数入口地址的指针 根据分析:首先说明是一个数组:数组名 其次,要说明其元素的数据类型指针:*数组名[ 再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组 名[)0.请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明 符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括 号的结合方向,那么*数组名[0说明的是什么呢?是元素返回值类型为指针的函数数 组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元亲是指针 第二种,蒙骗法: 尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。茨取 函数方法是:用不带有括号和参数的函数名得到。 函数名相当于一个指向其函数入口指针常量。那么既然函数名是一个指针常量,那么 就可以对其进行一些相应的处理,如强制类型转换 那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可 完整例子: #include stdio. h int add1 (int al, int b1) int add2 (int a2, int b2) void maino int numa 1=1 numbl=2 int numa2=2. numb2=3 int (*op [2])(int a, int b); Op[0=add1 op[1]=add2 printf("%d %d\n",op [0](numal, numb1), op[1](numa 2, numb2)) int add1 (int al, int b1) return al+bl int add2 (int a2. int b2) return a2+b2 [编辑本段]常用C变量的定义方式 a)一个整型数( An integer b)一个指向整型数的指针( A pointer to an integer) c)一个指向指针的的指针,它指向的指针是指向一个整型数( a pointer to a 第8页 C++笔记.txt pointer to an integer) d)一个有10个整型数的数组( An array of10 integers e)一个有10个指针的数组,该指针是指向一个整型数的( An array of10 pointers to integers f)一个指向有10个整型数数组的指针 (a pointer to an array of 10 integers g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数( a pointer to a function that takes an integer as an argument and returns an integer h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个 整型数( An array of ten pointers to functions that take an integer argumen and return an integer 答案是 a)int a;// An integer b) int wa; //A pointer to an integer c) int **a;//A pointer to a pointer to an integer e) int *a[10]; / An array of 10 pointers to integers f)int (*a)[10; //A pointer to an array of 10 integers g int (a)(int);//a pointer to a function a that takes an integer argument and returns an integer h) int (*a[1ol(int);// An array of 10 pointers to functions that take an integer argument and return an integer 1.C的按值传递: c中函数调用时按值传递的, 2.*和&:一样运算 &:声名的变量开辟的地址; 返回那个变量地址空间的取值; 题目 int *p; p=2003; *卫=3000H **卫的值为多少? p=*(*(p)=*(*(2003H))=*(3000H)=0300H 那么&&p、*(&p)和&(*p)又等于多少? &&p=&(&(p)=&(3001H),此时出错了,3001H是个常数怎么可能有地址呢? *&p=*((p))=*(3001H)=2003H,也就是*&p=p *p=&(*(p)=&(3000H),读者可能以为是*p=p此时出错了,3000H是个常数怎么可能 有地址呢 3.注意区分引用&和地址&的区别,指针*和声明符*的区别 &:引用别名,不占用内存空间 :声明符 4.数组指针/指针数组 数组指针(常数):数组名本身就是一个指针,指向数组的首地址 指针数组:整数数组,数组的各个元素就是整数,指向某个元素的首地址 第9页 C++笔记。txt c语言的排序方式: 2.两个表,建立两个表,每个表插入一条语句,查询一条语句,修改一条语勺,删除一条 语句 3.分别填入一个语句,完成下面的函数,通过递归计算数组a[100]的前n个数之和。 Int sum int a int n) if(n>0) return---------- else return 4.写出完整的程序,求大于1且小于参数n的偶数的和,输出结果 1nt *p; p=2003 p=3000H **卫的值为多少? *卫=*(*(p)=*(*(2003H)=*(3000H)=0300H。 那么&&p、*(&p)和&(*p)又等于多少? &&p=&(&(p)=&(3001H),此时出错了,3001H是个常数怎么可能有地址呢? *&p=*(&(p)=*(3001H)=2003H, 也就是*&p=p。 有地是((D)=8(300读者可能以为*DD此时出错了,300.是个常数怎么可能 6.使用指针的目的是什么? 第10页

...展开详情
img
jake443403168
  • 分享王者

    成功上传51个资源即可获取

关注 私信 TA的资源

上传资源赚积分,得勋章
最新资源