科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件『21天精通C++』第一周学习笔记

『21天精通C++』第一周学习笔记

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在C++中对象通常是指用户自定义的数据类型的类变量或结构变量,用户可以通过向这种数据类型添加函数使这个变量具有行为。

作者:雷神 来源:中国软件网 2008年3月31日

关键字: 笔记 精通 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

第一天:面向对象程序的设计把数据封装在一个安全的外壳中,并使他们具有活动性,变量可以主动的对自己进行操作而非被动等待程序代码对它操作。当需要打印变量内容时你不需要进行打印它们,只需要告诉变量进行打印自己。

上面说的变量和面向对象中说的对象理论上没有什么区别,只是C++这种OPP语言使数据具有了行为。

在C++中对象通常是指用户自定义的数据类型的类变量或结构变量,用户可以通过向这种数据类型添加函数使这个变量具有行为。

第二天:在学习C++之前用来定义自己的数据类型大概有以下三种方法:结构:struct;枚举:enum;联合:union通常把它们称为集合数据类型。

当定义一个变量赋值后从未使过编译时会警告,但程序可以通过。

函数是构成C++程序的主要部分。将程序分解为一些独立的模块,这些模块就称为函数,函数可以使程序的结构模块化。

所有的函数都必须进行原型声明,函数原型声明可以放在头文件中。负责告诉编译器函数中将要使用的参数的个数和类型。格式如下:

函数类型 函数名(参数类型1 参数1[,参数类型2 参数2] [,......]);
函数的第一行和函数原型声明一样,区别只是最后的没有分号。

函数的参数传递:

一种方法是用值传递,比较好理解,还有一种是传递实参的方法,及在引用调用函数方式时,将向函数传递参数的地址而不是参数的实际值。这样的好处是函数可以返回多个值。
函数原型防止程序输出时潜在的错误。

主函数不需要原型说明,因它被看作是一个自动说明原型的函数,主函数是第一个被执行的函数,且它不存在被别的函数调用的问题。

第三天:在使用IO流时需要头文件IOSTREAM,当时用流操纵算子和格式标志时需包含IOMANIP。

指针真正的作用是用指针在两个函数之间传递参数,和在堆中动态的分配内存。

void指针是全程指针,它可以指向任意的数据类型,除了const和volatile类型的指针外任何类型的指针变量都可以赋值给void类型的指针,甚至包括函数指针。

int i;//定义一个整形变量
int * ptrl;//定义一个指向整形的指针,也可以不严格的叫整型指针
i=10;
ptrl=&i;//&是取地址运算符,本例是将整型变量i的地址置于ptrl变量中

注意,void类型的指针在引用时必须强制进行类型转换,而且把它们赋值给其他类型时也必须进行类型转换。反过来一个普通的类型指针可以直接赋值给void类型。在进行强制类型转换时必须把星号和类型转换用括号括起来。 iptr=(int *)vptr;

以上讨论同样适合两个函数之间的用不同类型的指针传递参数


 

[下一页]


 

第四天:引用是自动的能间接引用的一种指针。

  自动间接引用的意思是可以自动得到一个引用值而不必使用间接引用操作符*。引用产生变量的另一个别名。引用的作用是通过引用在函数之间传递和返回参数。

int i=9;//定义一个整数变量i并把9赋值给它
int *iptr=&i;//定义一个整数指针变量iptr并将整数变量的地址赋值给它
int &rptr=i;//定义一个引用rptr并让它指向整数变量i,也就是rptr是i的一个别名,所有对rptr的操作都是对
file://rptr引用的变量i的操作。

如果要使用iptr所制的变量i,必须用*间接引用指针,而使用引用rptr所引用的变量i则什么都不用直接使用rptr就行。

用&定义一个引用;
象使用一个自用间接引用的指针一样使用引用;
为了简化多重指针的语法引用可以引用一个指针;
在定义一个引用时一定要初始化;
不要用*来间接引用一个引用;
一个引用只是依附在其所指变量的一个别名,这种依附在引用的作用范围内保持不变。

const int myage=18;
file://指向常数的指针:定义一个指针指向一个常数(虽然指向的不一定是常数)。
const int * aptrage=&myage;
file://常数指针:定义一个不能改变的指针,但它指向的值可以改变,同常数一样必须在定义常数指针的时候进行初始化。
int * const aptrage=&myage;
file://指向常数的常数指针:前两者结合。
const int * const aptrage=&myage;

用const来保护不应改变的值;
不能通过指针改变一个常数;
常数指针不可改变;
不能改变一个指向常数的常数指针和它指向的常数。
只读引用(只读别名):一个指向常数的引用;

int iv=18;
const int &rv=ic;//定义一个指向常数iv的引用,不允许通过rv改变iv因是只读引用。

练习:

# include
main(){
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
int *const mpmonth=monthdays;
for (int i=0;i<12;i++){
file://cout<<(mpmonth+i)< cout<<(i+1)<<"月有:"<<*(mpmonth+i)<<"天"< }
return 0;
}


 

[下一页]


 

第五天:new和delete是内存分配操作符,new用于分配内存,delete用于释放内存。

堆是计算机中一大块未使用的内存(除去操作系统和正在使用的应用程序所占内存之外的剩余内存),它的大小是随时在改变的,所以是动态内存。

在用new分配内存时不必对返回指针做类型转换。分配单一变量如int、float没有意义,分配数组时只需一个指针指向它的多个元素。

char *eName=new char[9];
delete [] eName;//释放为eName分配的所有内存。

堆不会自己初始化,必须用自己的数据初始化。
应该在分配内存时进行初始化

char * eName=new char(''a'');//这是一个字符。
char * eName=new char[9];//这是一个数组,有九个元素(如果是字符串,还要包括NULL0的空间)。
strcpy(eName,"base wood");//初始化数组的例子。

两维或两维以上的数组称为多维数组,也可叫矩阵(一维以上的数组,也称表)。
dataType (*matrixName)[numELs]....//矩阵变量的定义。
dataType//是任意的数据类型包括用户自定义的
matrixName//矩阵变量的名
numELs//除第一维后的维的大小。

例子:

float (* table)[6];//定义矩阵变量
table=new float[5][6];//分配存放30个浮点数的内存给矩阵变量。
float * table[6]=new float[5][6];//可以合并为:
delete [] table;//全部释放

异常处理是一个术语,指在一个错误(一个异常)发生时自动执行的函数,VC++的异常处理函数:
_set_new_handler(),在一个new失败时用户可以强迫异常处理程序执行自己的错误函数。_set_new_handler()自动检测所有的new操作并在必要时进行干涉。


 

 


 

第六天:在VC++中函数参数的传递有按值传递和引用传递两种方式。

如果接收函数改变了传送给它们的参数的值,而且这些改变在调用函数中被识别,则认为是按地址传送。

如果调用函数的参数在接收函数中保持不变则是按值传递。

所有的数组都自动被按地址传递,而不能按值传递数组,数组的名是一个指针。指针永远等于数据的地址。

任何非数组变量都可以采用引用传递,只要在接收参数表中插入一个&符号就可以表示一个变量进行引用传递。

引用传递是高效的安全的,可以在接收引用参数前加const,以防止函数无意间改变了引用参数。

在函数原型中可以声明缺省参数表,简化编程。函数不只可以声明一个缺省参数,可以按需要声明多个,还可以混合常规参数。但缺省参数必须在参数表中所有常规参数的后面。

defFun(int,flost,int=12,char=''a'');//标准的函数声明,可以不带参数变量名。带上变量名可以直接拷贝到函数的第一行,但函数的第一行不要求带缺省值。

在一个程序开始运行时传入的值称命令行参数。当敲入一个或多个命令参数给一个程序时,这些参数是通过两个变量来描述,一个是一个整型变量用于保存命令参数的个数,另一个是字符指针数组用于保存这些参数。每个数组元素指向一个参数。给个例子

main(int argc,*argv[])

argc和argv是标准名字,其中*agrv[]是一个指针数组,一个数组名是一个常数指针,所以argv是一个指向其它指针的指针。而argc保存的是实际的参数个数加1,第一个用于保存dos路径和文件名。

第七天:将功能类似,但要求参数有不同的类型和数目的函数重载。
为所有的重载函数说明原型。不要仅仅改变重载函数的返回值,只有不同的参数表才能把重载函数区分开。

用户给函数一个名字但VC在调用时会将此名字进行压延成另一个名字这样用来区分重载函数。
如果用户希望不压延函数调用,需要在程序的开头插入一个非压延函数清单。
extern "c" {
void cfun(int i,float x);
void cfun2(float x, float y);
}

重载运算符:operator...()//...表示所选择的运算符,除了?:条件操作符,::域运算符,*间接引用运算符,.成员运算符。

在自定义数据类型上实现内部运算,使用重载运算符。不能对内部数据类型定义重载运算,也不能改变运算符的优先级别。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章