C++入门学习笔记

这篇博客是C++学习者的入门笔记,涵盖了C++的基础知识,包括运算符、迭代器、枚举、typedef、对象、类、多态性、正则表达式、MFC应用等。内容详细介绍了迭代器的概念和作用,枚举的使用,以及不同类型的内存分配函数。此外,还讲解了C++中的类和对象、多态性、字符串操作类CString以及如何遍历目录查找文件。
摘要由CSDN通过智能技术生成

这些是我刚学习C++的笔记,拿出来与大家分享,希望大家更容易入门!

  • 1、 运算符<<(送出)用作输出运算符;cout是标准输出流。运算符>>(取入)用作输入运算;cin是标准的输入流。

  • 2、 输出:一个输出表达式的结果本身还可以用于进一步的输出。

void h2(int i)
{
        Cout<<”the value of I is”<<i<<’\n’;
}
  • 3、 输入:
Void h3(int i)
{
        Cin>>x;
        Getline(cin,str);
}
  • 4、 迭代器是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针接口,所谓迭代器是一种概念上的抽像:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,他可以把抽象的容器和同用的算法有机的结合起来。
    迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和c/c++操作array元素时的指针接口一致。不同之处在于迭代器是个所谓的复杂指针。具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义域内部。因此各种迭代器的接口相同,型号却不同。这直接导出了泛型程序设计概念:所有操作行为都是用相同接口虽然他们的型别不同。
    功能
    迭代器使开发人员能够在类或结构中支持foreach迭代,而不必整个实现IEnumerable或者IEnumerator接口。只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,将自动生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。
    特点
    1.迭代器是可以返回相同类型值的有序序列的一段代码;
    2.迭代器可用作方法、运算符或get访问器的代码体;
    3.迭代器代码使用yieldreturn语句依次返回每个元素,yield break将终止迭代;
    4.可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有惟一的名称,并且可以在foreach语句中被客户端,代码调用如下所示:foreach(int x in SimpleClass.Iterator2){};
    5.迭代器的返回类型必须为IEnumerable和IEnumerator中的任意一种;
    6.迭代器是产生值的有序序列的一个语句块,不同于有一个 或多个yield语句存在的常规语句块;
    7.迭代器不是一种成员,它只是实现函数成员的方式,理解这一点是很重要的,一个通过迭代器实现的成员,可以被其他可能或不可能通过迭代器实现的成员覆盖和重载;
    8.迭代器块在C#语法中不是独特的元素,它们在几个方面受到限制,并且主要作用在函数成员声明的语义上,它们在语法上只是语句块而已;
    9.yield关键字用于指定返回的值。到达yieldreturn语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。 迭代器对集合类特别有用,它提供一种简单的方法来迭代不常用的数据结构(如二进制树)。
    简介
    迭代器是一种检查容器内元素并遍历元素的数据类型。
  • 5、 枚举(enum)
    枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。
    例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,
    SATURDAY, 就是一个枚举。
    枚举的说明与结构和联合相似, 其形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;

如果枚举没有初始化, 即省掉”=整型常数”时, 则从第一个标识符开始, 顺
次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后, 其后的成员按依次
加1的规则确定其值。
例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。
enum Num{x1, x2, x3, x4}x;
当定义改变成:

enum Num
{
x1,
x2=0,
x3=50,
x4
}x;

则x1=0, x2=0, x3=50, x4=51
注意:
1. 枚举中每个成员(标识符)结束符是”,”, 不是”;”, 最后一个成员可省略
“,”。
2. 初始化时可以赋负数, 以后的标识符仍依次加1。
3. 枚举变量只能取枚举说明结构中的某个标识符常量。
例如:

enum Num
{
x1=5,
x2,
x3,
x4
};
enum Num x=x3;

此时, 枚举变量x实际上是7。
枚举类型变量的赋值和使用
枚举类型在使用中有以下规定:
1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。
2. 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。

main(){
enum weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
a=sun;
b=mon;
c=tue;
printf("%d,%d,%d",a,b,c);
}
  1. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如: a=sun;b=mon; 是正确的。而: a=0;b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单、双引号。
main(){
enum body
{ a,b,c,d } month[31],j;
int i;
j=a;
for(i=1;i<=30;i++){
month[i]=j;
j++;
if (j>d) j=a;
}
for(i=1;i<=30;i++){
switch(month[i])
{
case a:printf(" %2d %c\t",i,'a'); break;
case b:printf(" %2d %c\t",i,'b'); break;
case c:printf(" %2d %c\t",i,'c'); break;
case d:printf(" %2d %c\t",i,'d'); break;
default:break;
}
}
printf("\n");
}
10个数字,任意取出不相等的5个数字,
谁还记得这个算法的公式????????
用javascript有什么好的计算方法??
m n*(n-1)*(n-2)*...*(n-m+1) n!
C = --------------------------------------------- = --------------------------
n m*(m-1)*(m-2)*...*3*2*1 m!*(n-m)!

这个是公式,但是对枚举作用不大,还是要遍历循环才行.
这就需要一个好的算法

  • 6、 typedef
    typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
    在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
  • 7、 大小
    C++对象的大小事用char的大小的倍数表示的。按照定义char的大小为1,。一个对象或类型的大小可以用sizeof运算符得到。
    类型 大小
Char bool   1
Short,wchar_t   2
Int,long,float  4
Float,long double   8
  • 8、 显式类转换
    显示类型转换只是得到了一个所需类型的中间变量,原来变量的类型并不发生改变。
    标准C++中主要有4中显式类转换类型运算reinterpret_cast,static_cast,const_cast,dynamic_cast.
    1. reinterpret_cast
    语法:
returnvalue=reinterpret_cast(casting value);

这个操作符修改了操作数类型,但仅仅是重新解释了对象的比特模型而没有进行二进制转换。从语法上看,这个操作符仅用于指针类型的转换(返回值是指针)。它用来将一个类型指针转换为另一个类型指针,它只需在编译时重新解释指针的类型。这个操作符基本不考虑转换类型之间是否是相关的。
reinterpret_cast常用的场景如下:
1)普通指针转换,T*—>U*—>T*,保证T*经过一些列转换值不变
比如将不同类型的指针存在一个容器里,vector可以存int*,char*,string*等各种指针,只要有别的方式确定某个void*当初的类型是T*,标准保证reinterpret_cast(v[i])可以得到当初的值。
2)自己做memory allocator,可以将T*转换为U*,这个时候可能要注意字节对其的问题。
2、static_cast
语法:T static_cast (expression);
该运算符把expression转换成type-id类型,但没有运行时类型检查来保证转换的安全性。
static_cast是最经常用到的转换操作符,它最经常的一个应用就是将隐式转换变成显示转换,以消除编译器可能产生的warning,同reinterpret_cast不同,采用static_cast转换的两个类型之间一般有某种相关性。
static_cast主要应用场景如下:
1)用于类层次结构中基类和派生类之间指针或引用的转换。这个转换中,将派生类转成基类是安全的,将基类转成派生类时由于没有进行动态类型检查,所以是不安全的。
2)用于基本数据之间的转换。如把int转成char,int转成num等。
3)把空指针转换成目标类型的空指针。
4)把任何类型的表达式转换成void类型。

3、dynamic_cast
语法:dynamic_cast < type-id > ( expression )
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;
dynamic_cast的转换是在运行时进行的,它的一个好处是会在运行是做类型检查,如果对象的类型不是期望的类型,它会在指针转换的时候返回NULL,并在引用转换的时候抛出一个std::bad_cast异常。
dynamic_cast一般只在继承类对象的指针之间或引用之间进行类型转换。如果没有继承关系,则被转化的类具有虚函数对象的指针进行转换。

4.const_cast
const_cast< type-id > (exdivssion)
这个运算符可以用来去除一个对象的const或volatile属性。type-id必须是一个指针或者引用。
- 9、&—–取地址符运算
例如:

int e[3]={1,2,3};
          Int *p;
          p=&e[2];
          则:
          *p=2;
          *(p+1)=3;
          *(p-1)=1;
  • 10、C++语言中的基本数据类型及其范围 11、类
    类描述了一类食物,以及食物所应具有的属性,是一种用户自定义的数据类型。声明一个类时,以class关键字开始,接着是类的名字,其语法结构为:
Class <类名称>
{
    private:
    [<私有数据和函数>]
    public[<公有数据和函数>]
}

类表示了一组相似的对象,是创建对象的有效模板,用它可以产生多个对象。类所代表的是一个抽象的概念或事物,在客观世界中世纪存在的是类的实例,即对象。
类时具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了一个统一的抽象描述,其内部包括属性和服务两个主要部分。
类包含以下3种类型:
- private:私有类型包含数据和函数,在private关键字后面声明。如果省略private关键字,则必须紧跟在类名的后面声明。在类中声明的数据和函数如果不特别指明,都被视为私有类型。私有类型的数据值允许类本身声明的函数对其进行存取,而类的外部的任何函数都不能访问。
- public:公有类型public关键字后面声明,他们是类与外部的接口,任何外部函数都可以访问公有类的数据和函数。
- protect:保护类型用于类的继承,当类的成员被声明为protect时,从类的外部就不能对其进行访问。
类时面向对象程序最基本的单元。在设计面向对象程序时,首先要以类的方式设计实际待解决的问题,也就是将问题索要处理的数据定义成类的私有或公有类型数据,同时将处理问题的方法定义成类的公有或私有成员函数。

  • 11、对象
    对象时系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,有一组属性和对这组属性进行操作的一组服务组成。
    属性和服务是构成对象的两个基本要素,其定义是:属性是用来描述对象静态特征的一个数据项;服务是用来描述对象动态特征的一个操作序列。
    对象是类的实例,可以声明类时直接定义对象。此外,还可以在声明类之后再单独声明类对象。
Class example 
{
   
    Int I;
     Public;
    Float f;
    Void fun();
};
Example A;

对象声明后即可使用,使用方法如下:
对象名.成员函数名和对象名,数据成员名
例,可以按一下方式调用类example中的成员函数fun();
A.fun();

  • 12、类和类之间的关系
    1.关联关系
    关联关系表示两个类之间存在某种语义上的联系,即与该关联链接的类的对象之间具有一定的语义链接关系,该关系表达了类之间的一种相关性。
    2.依赖关系
    依赖关系描述的是两个类之间的语义上的连接关系,它是一种Use-A关系。假设两个元素A与B,如果修改元素A的定义可能会一起对另一个元素B的定义的修改,则称元素B依赖于A。
    3.聚合关系
    聚合关系是一种Has-A关系,它体现的是类之间的一种整体与部分的关系。
    4.泛化关系
    泛化关系是一种Is-A关系,它描述的是类之间“一般”与“特殊”的关系。具有共同特性的元素可以抽象为一般类,并通过增加其内涵,进一步抽象成特殊类。改关系可以将类组成一种有层次,有分类的结构。

  • 13、多态性
    多态性是指类中具有相似功能的不同函数使用同一个名称实现。
    多态性的实现与联编有关。将一个函数的调用与其相应的函数体代码相链接的过程,成为函数联编。
    静态联编,动态联编
    编译时的多态性是通过静态联编来实现的。静态联编是指在调用同名函数时,编译器将根据调用时所使用的实际参数个数、类型的不同确定应该调用哪一个函数的实现,它是在程序编译阶段就确定下来的多态性。静态联编通过使用重载机制来获得,重载机制包括函数重载和运算符重载。

  • 14、形参和实参
    形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
    形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。没有形参的函数在形参表的位置应该写void.main 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。
    实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
    实参和形参的区别:
    空白或占位符
    1.函数的形参列于函数声明中,在函数定义的函数体内使用。当函数调用时,形参(任何种类的)是一类将被填充的空白或是占位符。
    用来填充形参
    2.实参是用来填充形参的。当函数被调用时,实参列在函数名后面的括号里。执行函数调用时,实参被传递给形参。
    传值调用和引用调用
    3.传值调用和引用调用指的是用于参数传递过程中的一种机制。传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。

  • 15、运算符重载
    运算符重载本质上就是函数的重载,是函数重载的特殊形式(函数名为运算符号)。C++语言中允许程序员重新定义运算符的语义,这一机制称作运算符重载。

  • 16、正则表达式
    正则表达式又称正规表达式,常规表示法,计算机科学的一个概念。正则表达式使用单个字符串来描述。匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式常用来检索、替换那些符合摸个模式的文本。
    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值