« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
|
[C/C++]C/C++复习笔记 二 |
关于访问权限的控制public,private,protected以及friend.默认的struct的访问权限是public默认的class的访问权限是private关于protected 对于某个class的子类,是可访问的。关于friend全局函数,struct,class以及他们的成员函数声明为友元之后,就以访问实体的私有成员.例如在#ifndef FRINEND_H_#define FRINEND_H_ class X;//declaretion X class Z{public:void showXi(X* x);}; class X{private:int i;public:void init();friend class Y;//声明Y是X的友元friend void Z::showXi(X* x);//声明Z::showXi(X* x)是X的友元}; class Y{public:Y(X* x);}; #endif /*FRINEND_H_*/ 数组的初始化C++中编译器没有强制要求初始化数组,但初始化数组是非常重要的。比如说: int arry[10];这样编译器会在内存中申请一块大小为10的连续块,每块的大小为 sizeof(int)个字节,这个根据编译器的实现不同可能会有不同,这10个连续块没有被初始化,你可能会看到各种各样的结果。比如:for(int i=0;i<10;i++){cout<<i;//你可能看到各种奇怪的数字。}数组的初始化:你可以这样做: int arry[10]={0,1,2,3,4,5,6,7,8,9}; 结果是0123456789也可以只简单写成: int arry[10]={0};结果是000000000这种情况下编译器会报错误:int arry[2]={0,1,2,3};初始化值得个数太多。 Note* :在C++中,数组是不会做越界检查的,一定小心数据越界。比如说:int arry[4]={0};for(int i=0;i<5;i++){cout<<arry[i];//!这样编译器是不会报错的,但这很危险}特别小心类的数组,是调用类的默认构造函数初始化的,如果一个类没有了默认构造函数该类的数组是不能被初始化的。函数重载以及缺省参数1.函数重载是通过函数的参数列表实现的2.缺省参数int method(int var1=5){cout<<var1;}你可以这样调用method();输出是5;也可以这么调用method(3);输出是3。 缺省参数的两条原则:1.只有参数列表的后部参数才可是缺省的,也就是说,我们不可以在一个缺省参数后面又跟一个非缺省的参数。2.第二,一旦我们开始使用缺省参数,那么这个参数后面的所有参数都必须是缺省的。个人认为这可能造成调用上的混乱……比如说:如果同时声明并定义了int method(int var1=5)和int method()编译是不会出现问题的,但你无法调用method()方法,因为编译器不知道你使用的前者还是后者。当然,缺省参数本身的目的就是为了减少函数重载的个数,应该省去method()方法。 const关键字 const 是常量,这就意味着你不能改变他们的值 在header files用于定义某个常量作用类似于C中的宏定义在c中我们是这么做的#define MAX_SIZE 100int arry[MAX_SIZE];这种方式会有些问题,比如说MAX_SIZE 没有类型,只是在变异期间将MAX_SIZE替换成100。在复杂的宏中尤其明显例如:#define f(x) (x+1)f(1)展开之后的形式是:(1+1),f(1.0)的形式是(1.0+1)很显然一个值是int 一个float型在C++中我们使用const int CONST_MAX_SIZE = 100;以及内联(inline)函数实现宏const 与指针NOTE* const是右结合的const int*以及int* constconst int* 定义了一个指向cosnt int 类型变量的指针常量的指针比如说:cosnt string str =”Alex Loves Chris!”;要定义str的指针必须这么定义:const string* stu = &str;因为str本身为const string类型你可以这么做const string str ="Alex loves chris!";const string str2="chris loves alex";string str3 ="we love each other!";const string* ps = &str;ps = &str2;//!ps = &str3;而int* const定义了一个指向 int型变量的指针,而且这个指针指不能改变,也就是说它是个指针常量string str ="Alex loves chris!";string str2="chris loves alex";string str3 ="we love each other!";string* const ps = &str;//!ps = &str2;//!ps = &str3;ps 是const值,不能被改变 const 与函数参数以及返回值你可以把函数参数设置为const型,这样可以防止,函数对参数(指针,和引用)不必要修改,但这样作也许是更好的办法:void method(const int& i){//传const引用//!i++; //客户程序调用时const int i=10;method(i);}void method(int& pi){//这样做可以隐藏实现const int& cpi= pi;//客户程序在调用时int i=10;method(i);//!cpi++;} 函数重载根据的是函数参数类型,包括引用&和指针*的修饰,但在调用时会忽略掉引用修饰,这就使纯粹的传值和传引用的调用冲突,要避免出现这种情况。const 返回值对于内建类型,编译器不关心返回的是否是const 值。对于const int method();和int method();对编译器来说没什么因为返回的本事就是一个常量。所以应该尽量避免返回const内建类型。(因为没什么用处) 但对于class(返回的是引用?还是值?)以及指针,如果返回的const值,必须用const值处理.关于返回的是引用还是值:函数调用时在堆栈中进行的对于基本类型返回的一定是值,tinking in c++中说函数如果返回一个object需要调用拷贝构造函数,这个是不是以为着返回了一个值?但在gcc中却没有调用!但对于自定义类型的话const参数建议对于非内建类型的传递使用const,这样可以使嵌套使用比如:Object getObject();void method(const Object& obj);加了const修饰你可以这么使用:method(getObject());如果直接使用void method2(Object& obj);method2(getObject());是不能通过编译的,说method2的参数时临时变量。 在C++中(g++中)Object obj;// 栈中,调用默认构造函数,obj为Object引用Object obj = Object();//栈中,调用相应构造函数,再将引用付给objObject obj=getObject();//栈中,调用拷贝构造函数Object* obj = new Object();//堆中,调用相应构造函数,返回指针Object obj2 = obj;调用拷贝构造函数。这其实可以看成是在C++中引用必须初始化来解释,Object obj只是建立了一个引用,编译器要初始化这个引用就会出现上面的情况。C++中的引用其实就是一个const pointer,首先它是一个指针,这个指针必须初始化,const值,你可以改变这个指针所指向的存储区域的内容,但你不能改变这个指针的值。1.A reference must be initialized when it is created. (Pointers can be initialized at any time.)2.Once a reference is initialized to an object, it cannot be changed to refer to another object. (Pointers can be pointed to another object at any time.)3.You cannot have NULL references. You must always be able to assume that a reference is connected to a legitimate piece of storage.类中的const1.const变量可以使用参数初始化列初始化构造函数初始化列class Student{public:Student(){}//参数列表,这些成员变量将会在构造函数内代码运行之前被初始化Student(string name ,int age):_name(name),_age(age){}private:static const int SIZE=100;string courses[SIZE];string _name;int _age;}static const可以直接初始化2.const对象const Student stu =Student();const对象只能调用const方法3.const方法如果某个没有修改这个类,这个方法可以声明成const方法,反过来,如果一个函数声明称const,那么它就不能修改这个类。 | |
|
|
|
统计 |
blog名称: 日志总数:7 评论数量:9 留言数量:0 访问次数:40477 建立时间:2006年1月7日 | |