c++知识点总结(精选7篇)
篇1:c++知识点总结
C++知识点总结
Day01
一、名字空间(标准库中的标识符都定义在std名字空间中)
1、名字空间的定义
namespace 名字空间名{ 名字空间成员 }
2、名字空间指令
using namespace 名字空间名;
3、名字空间声明
using 名字空间名::标示符;
4、无名名字空间
namespace { 名字空间成员;}
5、无名名字空间的声明
::标示符
二、C++的结构、联合和枚举
1、C++的结构里面可以定义函数
2、C++里定义结构型变量的时候可以省略struct关键字
3、C++中的声明联合类型的变量可以不加union关键字,支持匿名联合
4、C++的枚举是一个独立的数据类型,而不是整数类型。
三、C++的bool类型
bool类型变量只可以取true或false
四、C++的函数
1、函数支持重载
重载:在同一个作用域中,函数名相同,参数表不同的函数之间构成重载关系。函数原型:返回类型+函数名+参数表
函数签名:函数名+参数表 //c++中,同一作用域中,函数签名必须是唯一的。
2、函数指针
函数指针的类型决定其具体指向的重载版本,而不是由实参的类型决定。
3、extern “C”
通过extern “C”指示编译器以C语言的方式处理C++源文件中的C函数(不做函数名置换)。
5、缺省参数
如果为函数的一个参数指定了缺省值,那么该参数右面的所有参数必须都有缺省值。注意:缺省参数只能用在函数的声明中。
6、哑元
借助哑元参数保证函数的向后兼容。借助哑元实现函数的重载。
7、内联
内联函数保持了函数的特性,同时避免了函数调用的开销。
inline关键字仅仅表示希望该函数被编译为内联,通常情况下,大函数和递归函数不会被处理为内联。
五、内存分配
1、new/delete操作符
如果内存是以数组的形式分配的,那么也应该按照数组的方式释放——delete[]。
如果new失败,这时会抛出bad_alloc异常,程序应该捕获并处理该异常,否则进程将被系统杀死。
Day02
一、引用&
1、引用实际上是一个变量的别名。
2、引用必须在声明的同时初始化
3、引用一旦初始化,再不能引用其他变量
4、只有const型引用才能引用常量
5、不能对常引用做赋值操作
二、C++中的类型转换
1、静态类型转换: static_cast<类型>(变量);需要编译器对类型转换安全性进行检查; 将void*转换为具体类型的指针。
在源类型和目标类型之间只要有一个方向上可以做隐式类型转换,那么在两个方向上就都可以做静态类型转换。
2、动态类型转换:dynamic_cast<类型>(变量);用于在具有多态特性的父子类之间的转换。
3、常量类型转换:const_cast<类型>(变量);去除指针或者引用上的const属性。
4、重解释类型转换:reinterpret_cast<类型>(变量);允许对任意类型的指针进行转换。在指针和整型之间进行转换。
三、类和对象
1、类的声明和定义可以分开、类的成员变量、类的成员函数。
2、类的访问控制
1)public:公有成员,谁都可以访问。
2)private:私有成员,只有自己才能访问。
3)protected:保护成员,只有自己和自己的子类可以访问
访控限定符
| 访控属性
| 自己
| 子类 | 其它--------------public
|
公有
|
Ok | Ok | Ok protected
|
保护
|
Ok | Ok | No private
|
私有
|
Ok | No | No 注意:类的缺省访控属性是私有,而结构体的缺省访控属性是公有。
3、构造函数
1)如果一个类中没有定义任何构造函数,系统就会自动提供一个默认的无参构造函数。2)如果为一个类定义了构造函数,系统就不会在为该类提供任何构造函数了。3)构造函数可以重载 4)构造函数初始化列表:
1>需要对类类型的成员变量做初始化; 2>含有引用或常量型成员;
4、对象的创建与销毁 1)在栈中创建对象
类名 对象名(构造参数);// 隐式构造
类名 对象名 = 类名(构造参数);// 显式构造 2)在栈中创建对象数组
类名 数组名[元素个数] = {类名(构造参数),...};3)在堆中创建对象
类名* 对象指针 = new 类名(构造参数);4)在堆中创建对象数组
类名* 对象数组指针 = new 类名[元素个数];Day03 类和对象(下)
一、this指针
1、一般而言,关键字this是一个指针。对于一般成员函数,它指向调用该成员函数的对象,而对于构造函数,它则指向这个正在被构造的对象。
2、在构造函数中可以通过this指针区分成员变量和局部变量(包括参数)。
3、基于this指针的自身引用还被用于支持多重串联调用的场合。
4、将this指针作为函数的参数,实现对象间的交互。
二、常量型成员函数和常量型对象
1、常量型成员函数中的this指针为常量型,以此防止对成员变量的意外修改。对常量型对象(包括指针和引用),只能调用其常量型成员函数。
2、被声明为mutable的成员变量可以在常量型成员函数中被修改。
3、常量型成员函数和具有相同签名的非常量型成员函数构成重载关系。
4、当常量型成员函数与非常量型成员函数构成重载关系时,非常量对象会优先选择非常量型成员函数。
三、析构函数
1、没有参数,不能重载。
构造顺序:创建成员变量->构造函数体 析构顺序:析构函数体->销毁成员变量
2、缺省析构函数
1>对于未定义析构函数的类,系统会提供缺省析构函数,该析构函数负责销毁该类的成员变量。
2>缺省析构函数不负责释放动态分配的资源。
3、对于动态分配的资源,必须通过自己定义的析构函数进行释放。
4、析构函数是释放的资源不仅限于内存资源。
四、拷贝构造函数
1、拷贝构造:用一个已有的对象去构造另一个同类型的副本对象。
2、拷贝构造是通过拷贝构造函数实现的。class 类名 {
类名(const 类名& 源对象引用){
从源对象到当前对象的复制;
} };
3、如果没有为一个类提供自定义的拷贝构造函数,系统就会提供一个缺省的拷贝构造函数,实现从源对象到目标对象的复制。
4、某些情况下系统提供的缺省拷贝构造函数可能无法满足具体的应用需求。这时就有必要提供自定义的拷贝构造函数。
5、拷贝构造发生的时机 1>构造对象副本;
2>以对象作为函数的参数和返回值; 3>以对象的方式捕获异常。
五、拷贝赋值运算符
1、拷贝赋值:用一个已有的对象赋值给另一个同类型的副本对象。
2、拷贝赋值是通过拷贝赋值函数实现的。class 类名 {
类名& operator=(const 类名& 源对象引用){
从源对象到当前对象的复制;
} };
3、如果没有为一个类提供自定义的拷贝赋值函数,系统就会提供一个缺省的拷贝赋值函数,实现从源对象到目标对象的复制。
4、某些情况下系统提供的缺省拷贝赋值函数可能无法满足具体的应用需求。这时就有必要提供自定义的拷贝赋值函数。
六、静态成员
1、静态成员是属于类的,唯一的,可为该类对象所共享。
2、静态成员函数只能访问静态成员。
3、非静态成员函数既能访问静态成员,也能访问非静态成员。
4、静态成员变量必须在类外定义并初始化。
5、既可以通过类也可以通过对象访问静态成员,但最好通过类。
6、静态成员同样受类的访问控制属性的影响。
Day04
一、指向成员变量的指针
1、定义语法:成员变量类型 类名::*指针变量名;string Student::*pstrName;//pstrName是指向Student类中string类型的成员变量的指针
2、赋值即初始化语法:指针变量名= &类名::成员变量名;pstrName = &Student::m_strName;// pstrName指向Student类的m_strName成员变量
3、解引用语法:对象.*指针变量名 或者 对象指针->*指针变量名 Student student(...);cout << student.*pstrName << endl;Student* pStudent = &student;cout << pStudent->*pstrName << endl;
二、指向成员函数的指针
1、定义语法:成员函数返回类型(类名::*指针变量名)(形参表);void(Student::*pfuncSetName)(const string&);
2、赋值和初始化语法:指针变量名 = &类名::成员函数名;pfuncSetName = &Student::SetName;
3、解引用语法:(对象.*指针变量名)(...)、(对象指针->*指针变量名)(...)Student student(...);//创建对象(student.*puncSetName)(...);Student* pStudent = &student;//创建对象指针(pStudent->*pfuncSetName)(...);
三、对于静态成员,可以使用普通指针访问,不需要成员指针。
四、操作符重载
1、操作符的通用语法
1)双目操作符:<左操作数><操作符><右操作数>,L#R。
2)单目操作符:<操作数><操作符>或<操作符><操作数>,O#或#O
2、被重载操作符的操作数中至少有一个是类类型。
3、重载操作符不会改变优先级。
4、重载操作符无法改变操作数的个数。
5、除“()”以外所有操作符函数都不能含有缺省参数。
6、所谓重载操作符实际上就是定一个提供操作符运算法则的函数(成员函数或全局函数)。
五、双目操作符重载
L#R 全局函数:operator#(L, R),如果需要可定义为友元。成员函数:L.operator#(R)
六、单目操作符重载
#O 全局函数:operator#(O)成员函数:O.opertor#()取负运算“-“
七、输入输出操作符重载
一般情况下,输入输出操作符比较适合通过全局(友元)函数来实现,避免修改标准C++库的iostream类。
重载输出运算符函数形式:
ostream& operator<<(ostream& os, const 类名& 对象引用){
输出对象的内容;
return os;} 重载输出运算符函数形式:
istream& operator>>(istream& is, 类名& 对象引用){
输入对象的内容;
return is;}
八、不允许重载的操作符
::
-作用域解析.取字节数 typeid针对键盘设备的输入流对象针对显示器设备的输出流对象针对出错设备的输出流对象-stderr
3、文本I/O 1)文本文件的格式化I/O 2)文件位置
A.get和put位置 B.随机读写 3)非格式化I/O
4、二进制I/O
篇2:c++知识点总结
较得闲之际,将整理出有关C++在笔试中常考到的知识点,这些都是我遇到的一些笔试题目或者是我自己以前搜集整理的资料,现在拿出来希望可以给大家一些帮助。如果有什么错误之处,请各位指出,谢谢!
1.C++跟C语言的异同之处?
答:C++语言来源于C语言。
同:规则简单,具有数据表示运算功能,可以直接对内存操作,运行效率高,异:C语言缺乏数据类型检查机制,代码重用性差;C++强化了数据的类型检查和语句的结构性,增加了面向对象的程序设计的支持。
2.请问C++的类和C里面的struct有什么区别?
答:struct的成员的默认访问说明符为Public,而class的成员的默认访问说明符为Private。其他没有区别
3.列举关键字static在C++中的作用。
a)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其
值不变。
b)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内
所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
c)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调
用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4.编程题: 用最有效率的方法算出2乘以8等於几? ————2 << 3,2向
左移3位。
5.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
答:区别主要在两点:
a)条件操作只能操作布尔型的,而逻辑操作可以操作布尔型和数值型。b)逻辑操作不会产生短路。
6.&的意义:包括取址和引用。两者的区别如下所示:
int a;
int &pa;
int &ra=a;//ra 是a的别名,只能在定义时初始化
pa=&a;//pa指向a,这里的&是取址。
7.关于指针变量
答:
变量的地址是一个十六进制整数。
能够存放地址的变量称为“指针类型变量”,简称“指针变量”。计算机的CPU决定了内存寻址方式,所以不管指针所指的对象是什么
类型,指针值本身的规格都是一样,例如,16位或者32位的整数。关
联类型的作用是控制对象的访问。如果关联类型为int,通过指针变量访问对象时,读取从指针值指示的位置开始的连续4个字节,并按整型数据解释。
Void *vp,void指针变量能够存放任意内存地址。因为没有关联类型,编译器无法解释所指对象,程序中必须对其进行强制类型转换,才可以按指定类型数据使用。
8.关于内存方面
答:
a)关于内存的分配
内存单元由操作系统按字节编号,称为地址。一个变量的地址值是系统分配的,不能由高级程序设计语言决定,但C++可以知道分配后的地址值。
b)关于内存对齐的问题以及sizof()的输出
编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
c)关于内存的访问
在内存建立一个对象之后,可以用名方式访问 和地址方式访问。名方式访问:操作对象的内容,也叫直接访问。访问形式分为
“读”和“写”。
地址方式访问:一个对象的地址用于指示对象的存储位置,称
为对象的“指针”。指针所指的物理存储空间称为“指针所指
对象”。通过地址访问对象又称为“指针访问”。指针访问运
算符“*”,取址运算符是“&”。
9.请讲一讲析构函数和虚函数的用法和作用。
答:析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性
10.关于关键字extern和Static的说明:
答:
a)关键字extern和static声明静态存储变量和函数标识符。全局声明的标识符默认为extern。
b)当这两个关键字用于说明变量时,程序开始执行时就分配和初始化
存储空间,用于说明函数,表示从程序执行开始就存在这个函数名。c)用static声明的局部变量只能在定义该变量的函数体中使用。
d)与自动变量不同的是,static在第一次使用时进行初始化(默认初始
化值为0)。函数退出时,系统保持其存储空间和数值,下次调用时,static变量还是上次退出函数时的值。
e)程序的其他文件也能够访问全局变量,但必须在使用该全局变量的每个文件中用关键字extern予以声明。
11.关于变量与常量:
答:变量的赋值运算是在程序运行时才执行的操作。常量定义在编译阶段就被确定下来。
12.关于数组元素:
a)只有定义静态数组,C++才会自动把各元素值初始化为0。(static)b)数组由CONST约束为常量的,必须在定义的时候初始化,不能在程序代码中对它的元素重新赋值。
13.关于全局变量和局部变量:
答:具有文件作用域的变量称为全局变量。具有函数作用域或块作用域的变量称为局部变量。全局变量声明默认初始值为0。当局部变量和全局变量同名,在块内屏蔽全局变量。在块内访问全局变量,可以用域运算符“::”。
14.关于函数参数传递问题。
答:
a)参数的定义:参数是调用函数与被调用函数之间交换数据的通道。
函数定义首部的参数称为形式参数(形参),调用函数时使用的参数称为实际参数(实参)。实参必须与形参在类型,个数,位置上对应。b)函数调用前,形参没有存储空间。函数被调用时,系统建立与实参
对应的形参的存储空间,函数通过形参与实参通信,进行操作。函数执行完毕,系统收回作为形参的临时存储空间。这个过程称为参数传递或参数的虚实结合。
c)C++有3种参数传递机制:值传递(值通用),指针传递(地址调用)
和引用传递(引用调用)。实参和形参按照不同传递机制进行通信。d)三种传参方式的比较:
篇3:c++知识点总结
关键词:着眼点;C++;学习方法
中图分类号:G642.0文献标识码:A文章编号:1671-0568(2012)41-0061-02
C++程序设计语言是一门既注重理论学习又着眼思维训练的基础课程,在计算机课程体系中起到承上启下的作用。本文基于教学中的不断总结,认为学习者在具有了一定C++入门知识后,可以从以下几个着眼点来学习和巩固C++基础知识,为进一步学习打牢基础。
一、从内存着眼的观点
迈入程序设计门槛重要的一步是理解冯·诺依曼的“存储程序控制”原理。相当多的基础概念都是围绕内存及对内存的操作展开的。教学中以内存条的实物展示结合内存的物理结构来介绍存储数据的空间,强调它们是一系列连续编号的“房间”。每个房间有门牌号和存储空间(即一个字节)。基于实物的认知,一方面可以有效地帮助我们理解并掌握对内存访问所涉及的基础概念。诸如,变量(对象)的名、值、地址、别名(引用)及指针;另一方面介绍系统内存是分区存在,以巩固用户区和代码区、静态存储区和动态存储区的概念,可以帮助理解函数原型、函数接口、函数指针等较为抽象的相关概念。
授课时,板书内存并标注在静态存储区和动态存储区后,可以形象地演示在动态存储区内动态申请和撤销对内存的使用情况,便于灵活运用启发式教学方法引导学习者轻松掌握生存期、作用域、输入输出流等一系列相关概念。由于程序设计语言中大多数概念都是与内存相关的,初学者有了对内存形象全面的认识,对掌握概念和理解原理能起到事半功倍的效果。
二、从类型着眼的观点
类型是一个贯穿程序设计语言的基本概念,将类型作为深入学习的一种视角,有助于学习者在理解掌握新知识的过程中克服学习中的难点。首先,深入了解万事万物是分型的,类型表明一类变量(对象)的示数能力、运算功能、占用存储空间。除系统支持的基本类型外,另有指针类型、引用类型、函数类型以及关联这些类型指针类型。集中巩固这些类型的定义形式、应用场合,将快速提升阅读程序代码的能力。接着,很自然引入自定义的类型——结构和类类型,指出与基本类型定义变量一样,自定义的类型定义对象也要开辟空间和赋初值(调用构造函数来完成),只不过开辟的空间是本类中数据成员空间的组合。这样从基本类型、变量的概念和应用,引申至类与对象,从而克服面向对象程序设计中概念难点。
三、从语言着眼的观点
C++程序设计首先要介绍的是一门与机器打交道的语言,和外语课程的学习一样,基本概念语法规则等必须记忆、迁移和联想,以达到牢记并熟练应用的目的。
学习语言首先必须从基本的词汇和语法学习开始,在入门阶段需要死记硬背一些概念和规则,作为构建知识体系的基石。以运算符教学为例,做一叙述。教材中会以表格的形式列出的关于运算符和结合性规则。教师在讲授时,首先强调这一表格是C++程序设计指令系统语法中的基本规则,一些运算符不同场合可以有多种语义功能,除去表上列出的功能外,还可以按照一定规则重新自定义其功能,但其优先级和结合性不变。其次,还可以告诉学生一些前人总结的牢记方法。如,关于优先级、结合性记忆方法如下:①习惯上和数学规则一致;②括号优先级最高,“豆腐条”(即优先级最低的运算符是逗号、赋值、条件运算符)优先级最低;③在一个表达式中,可能包含算术运算、关系运算和逻辑运算,优先级从高到底为:“!→算术运算符关系运算符→&&→||”旷;④关于结合性,一般情况是从左到右,但是单目运算符和赋值(含复合赋值)运算符是从右到左。以上从记忆角度对书中表格的解读简洁实用,十分便于记忆。掌握了这四条后,通过较少的实例训练,学生即可将这一基础知识点牢固掌握。
牢固掌握上面的基础知识后,在后续讲解复杂类型时,如,int(﹡[3]),就可以利用语言学习迁移原理帮助初学者轻松掌握:可以按照上述知识记忆点分析如下:括号()和后部的括号[]优先级相同,从左到右先看()内的(﹡口。其中﹡与[]比较,[]优先,表明此处声明的是个数组,该数组元素是指针类型。()外部的int[]是指针的关联类型。于是可以明确地知道,该语句声明了包含3个元素的一个指向整型数组(有4个元素)的指针数组。该指针数组中元素有3个,为指针类型,每个指针可以指向一个包含4个元素的整形数组。
通过以上分析,向学生表明,从优先级和结合性的角度来看待复杂类型声明语句,复杂类型就不是什么新东西,而是新瓶装旧酒。这样可以帮助学生克服畏难情绪,引导学生通过前边已学知识迁移贯通,轻松迈过这一语言知识难点。
持有“我们正在学习的是一门语言”这一观点,可以在C++学习的进程中不断鼓励自己发现和总结记忆规律,为深入进阶学习阶段打下基础。金盾出版社于2010年7月出版的赵卫滨教授《背口诀14天精通C语言》就是理论口诀化方面长期经验总结的结晶。该书中结合各个知识点用归纳总结了一系列口诀,帮助初学者记忆。这些记忆口诀不但能给学习C++带来帮助,还能启发学习者立足自己的情况,在学习语言的道路上不断总结记忆新知识。
四、从参数化着眼的观点
进入到全局变量、预处理、函数和对象等知识的学习阶段后,学生逐渐体会基础知识中的参数化概念。有如刚小升初后接触代数一样,小学接触的确定的数据到初中开始被抽象描述为变量,此时程序设计逐步运用参数化来实现代码的复用、提高代码的通用性和灵活性。C++中的方法、函数、类库头文件等体现软件工程的设计思想:让程序模块化,把特定的代码逻辑独立封装,只传人参数和返回参数,外部集中调用。
以参数化的观点看,预定义全局变量值的修改可完成后续设计代码中同一量的同步更新;预处理中条件编译可以依据参数不同选择参与编译的代码语句段;函数参数及其相关概念如参数传递机制:值传递、指针传递、引用传递均体现了数据量本身的参数化;函数模板、类模板所代表的泛型编程体现了数据类型的参数化。模板把函数或类要处理的数据类型参数化,用于表达逻辑结构相同但具体数据元素类型不同的数据对象的通用行为。参数化建模编程,为解决通用程序和特定需要之间的矛盾提供了一种新方法和新途径。
持有参数化的观点学习和巩固C++知识,可以在编程实践中不断体会代码复用优点和好处,还可以从更深的层面理解结构化编程和面向对象的编程提出来的封装、交互、接口、抽象、复用、容器、泛型等较为抽象的概念术语,对后续学习数据结构及算法分析等相关课程做出充分铺垫。
五、与编译器打交道的观点
C++是世界上应用最广泛的编程语言之一,很多硬件和软件中都有对应的C++编译工具。编写C++高级程序设计语言源程序,首先要考虑能通过编译程序的编译,形成低级语言目标代码供调试和运行;其次要考虑能够移植到方便移植到的当前大部分平台上运行。编译系统软件程序的基本原理和技术有着典型性和广泛性,在软件工程、逆向工程、语言转换及其它领域都有着广泛的应用。谭浩强教授在《C++程序设计题解于上机指导》一书的前言中指出,学习C++不应只局限于使用一种编译环境,希望读者能掌握一种以上的编译和运行C++程序的环境与工具。
因此,巩固C++基础知识的学习要从编译器的角度着眼,分析编写源代码和上机调试纠错,打下语法分析、语义分析的基础。从开始就有意识地考虑代码的跨平台特性,尽可能避免设计代码二义性,并保证代码的可重复使用性。在学习和参考前人的代码时,尽可能使用遵循国际标准C++的规定来分析和消化吸收。此外,还可以利用已经学习的知识,分析程序运行时可能出现的各种意外情况,尝试运用异常处理,增加适当的纠错机制。持有与编译器打交道的观点进行学习,能够促使我们不断巩固已学的知识,在提高应用能力的同时形成良好的编程习惯。
本文从以五个不同的着眼点来看待和巩固C++程序语言的学习。笔者多年的教学实践表明,立足以上着眼点来学习C++基础知识,可以帮助学生迅速掌握程序设计语言学科的知识结构,融会贯通所学的知识,有效促进学生的思维从多方面展开,进而提高学生掌握知识的质量,为进一步学习计算机课程体系的后续课程打下坚实基础。
篇4:c++知识点总结
16、要想共享初始化的过程,可以先定义一个共享成员函数,然后每个构造函数都调用之。
17、C++提供的默认构造函数是个无参构造函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数,C++就不再提供默认的构造函数。(如果此时还想要无参构造函数,则需要自己定义)
与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则对象值是随机的。创建对象的唯一途径是调用构造函数。
静态对象只被构造一次,所有全局对象都在主函数main()之前被构造。
18、面向对象程序设计主要是两方面:面向对象应用程序设计,类库的设计。面向对象程序设计的关键是如何抽象和分类。
19、全局变量、静态变量、常量存放在全局数据区,所有类成员函数和非类成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间都被作为堆区。
void* malloc(size_t);和void free(void*);在头文件malloc.h中声明。而操作符new和delete是C++的一部分,无须包含头文件,它们都是从堆中分配和释放内存块,但是具体操作上两者有很大的区别。
操作堆内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄露,这与函数中栈区分配局部变量有本质的区别。
从C++来说,不使用malloc()函数一个原因是,它在分配空间的时候不能调用构造函数。
类对象的建立是分配空间,构造结构及初始化的三位一体,它们统一由构造函数来完成。而new和delete在创建对象和删除对象时,便同时调用构造函数和析构函数。
定义对象数组,在生成对象时,依次调用构造函数(如依次生成ps[0],ps[1],ps[2]......),由于分配数组时,new的格式是类型后面跟[元素个数](student* ps=new student[10]),不能再跟构造函数参数,所以从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数,如果该类没有默认的构造函数,则分配对象数组失败。Delete[] ps告诉C++将要该指针指向的是一个数组,如果在[]中填上了长度信息,C++将忽略。20、拷贝构造函数
当构造函数的参数为自身类的引用时,这个构造函数称为拷贝构造函数。拷贝构造函数的功能是用一个已有对象初始化一个正在建立的同类对象。拷贝构造函数定义形式如下: Student(student& s)
27、C++基础笔记(一)墨涵天地
Person p1;
p2=p1;
27、C++基础笔记(一)墨涵天地
27、C++基础笔记(一)墨涵天地
在创建对象p2时,对象p1被复制给了p2,同时资源也作了复制,此时p1和p2指向不同的资源,这称为深拷贝。
27、C++基础笔记(一)墨涵天地
如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。C++提供的默认函
数只是对对象进行浅拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,要自己定义拷贝构造函数,为创建的对象分配堆空间。
21、静态成员
这种属于类的一部分,但既不适用于普通成员函数,也不适用于全局变量表示的数据,我们用静态成员来表示。
一般情况下,我们在类的内部实现中对静态数据成员进行定义(在类的内部实现中分配空间和初始化)。
Int student::noOfstudent=0;静态数据成员一般用于:
标志一个事件的发生与否,某个特定的指针,变化的对象等。
静态成员函数定义是类的内部实现,属于类的一部分,定义位置同一般成员函数。与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象。如果用对象去引用静态成员函数,只是用其类型。
#include
} protected: char name[40];static int noOfStudents;};int Student::noOfStudents=1;int main(){ Student s;cout< ********************************* class Sc { public: void nsfn(int a);//类同声明成Sc::nsfn(Sc* this,int a) static void sfn(int a);//无this指针 //...};void f(Sc& s){ s.nsfn(10);//C++编译成Sc::nsfn(&s,10)s.sfn(10);//C++编译成Sc::sfn(10)} 经过一个学期对《C++程序设计》的学习,我学习到了基本的理论知识,了解到了C++语言程序设计的思想,这些知识都为我的课程实践和进一步的学习打下了坚实的基础。在为期近两周的C++课程设计中,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己以前学习到的知识。这些都使得我对计算机语言的学习有了更深入的认识!总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。像职工信息表这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。特别是学会了在Visual C++中如何调试程序的方法。当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。 在老师和同学的帮助下,通过自己的努力,终于完成了这次职工信息表的简单课程设计。我经过这段时间的编程,对其中的艰辛,我是深有体会。从刚开始的选择程序、理解程序到后来的调试程序以及改进程序这个过程中,我遇到了各种各样的困难和挫折。但是我坚定信念,对自己充满了信心,想尽一切办法克服重重困难。 通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。另外某些具体的细节内容也是相当的重要。这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。这些经验对我以后的编程会有很大的帮助的,我要好好利用。 虽然这次课程设计是在参考程序的基础之上进行的,但是我觉得对自己是一个挑战和锻炼。我很欣慰自己能在程序中加入自己的想法和有关程序内容,也就是对它的程序改进了一番改进,并有创新。但是我感觉自己的创新还不够典型,总之还不是很满意。另外由于时间的紧迫和对知识的了解不够广泛,造成了系统中还存在许多不足,功能上还不够完善。以后我会继续努力,大胆创新,争取能编写出透射着自己思想的程序。这次课程设计让我充分认识到了自己的不足,认识到了动手能力的重要性。我会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础! 总而言之,这次C++程序设计实践让我收获很大。 计算机科学与技术13-2班 实验一 VC++ 6.0开发环境应用入门 1.实验结果: 2.实验结果分析: 该程序是利用C++输出两句话,练习输出格式。实验二 C++简单程序设计 1.实验结果: 2.实验结果分析: 求一个图形的面积要先判断是哪一种图形,用switch语句就可以解决,再利用公式即可。如输入1为圆形,再输入边长3,利用面积公式,它的面积就是28.2744。 3.实验结果: 4.实验结果分析: 复习i++与++i的运用。i++在当前语句时,此时i的值是没有变化的,直到此句执行结束,i的值才会+1;++i在当前语句执行之前时,i的值就已经+1。实验三 函数的应用 1.实验结果: 2.实验结果分析: 函数的递归作用,先声明定义一个函数,输入形参n的值,然后进行比较,小于3的直接返回1;大于3的就继续递归,直到得到的形参值小于3,返回1为止。从程序结果得知,返回n个1就最终递归返回n。 3.编写一个函数把华氏温度转换为摄氏温度,转换公式为:C =(F-32)* 5/9。 4.使用系统函数pow(x,y)计算x的值,注意包含头文件math.h 程序: y 实验总结: 1.基本掌握如何操作C++的界面,包括运行,编译,调试等过程; 2.学会编写简单的C++程序,掌握基本数据类型变量和常量的应用,运算符与表达式的应用; 3.学会使用VC++6.0开发环境中的debug调试功能:单步执行、设置断点、观察变量值;熟练使用F10,F11,shift+F11,ctrl+F10等快捷键的使用。 4.基本掌握函数的运用,并对C语言的复习与运用,认识了C++与C语言的异同。 实验报告 实验四 C++程序的结构 一、实验目的 1.观察程序运行中变量的作用域、生存期和可见性; 2.学习类的静态成员的使用; 3.学习多文件结构在C++程序中的使用; 二、实验任务 1.运行下面的程序,观察变量x、y的值。 #include cout << “Step into fn1()...” << endl; using namespace std; fn1(); void fn1(); cout << “Back in main” << endl; int x = 1, y = 2; cout << “x = ” << x << endl; int main() cout << “y = ” << y << endl; { return 0; cout << “Begin...” << endl; } cout << “x = ” << x << endl; void fn1() cout << “y = ” << y << endl; { cout << “Evaluate x and y in int y = 200;main()...” << endl; cout << “x = ” << x << endl; int x = 10, y = 20; cout << “y = ” << y << endl; cout << “x = ” << x << endl; } cout << “y = ” << y << endl; 2.实现客户机(CLIENT)类。声明字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中声明类和实现类,在文件client.cpp中测试这个类,观察相应的成员变量取值的变化情况。 程序: //实现客户机(CLIENT)类。 #include cout<<“Client构造函数被调用”< Clientnum++;} ~Client(){ cout<<“Client析构函数被调用”< Clientnum--;} static void ChangeServername(){ cout<<“请输入服务器的名字:”< cin>>SeverName; } void show();};int Client::Clientnum=0;char Client::SeverName[10]=“abcd”;//Client.cpp void Client::show(){ 实验五 数组、指针与字符串 一、实验目的 cout<<“该用户机的服务器端名字是:”< //Client.exe void main(){ Client::ChangeServername();Client a;a.show();Client::ChangeServername();Client b;b.show();Client::ChangeServername();Client c;c.show();} 1.学习使用数组数据对象; 2.学习字符串数据的组织和处理; 3.学习标准C++库的使用; 4.掌握指针的使用方法; 5.练习通过debug观察指针的内容及其所指的对象的内容; 6.练习通过动态内存分配实现动态数组,并体会指针在其中的作用; 7.分别使用字符数组和标准C++库练习处理字符串的方法。 二、实验任务 1.编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。 程序: #include for(i=0;i<3;i++)cout<<“请输入一个3*3的矩 cout< cout< for(j=0;j<3;j++)} cin>>a[i][j];2.使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。 程序: #include int i,j,t; cout<<“请输入一个矩阵元素个数n*n=”; cin>>t; int *p=new int[t]; cout< for(i=0;i cin>>p[i]; cout<<“该矩阵的转置为:”< for(j=0;j { for(i=0;i { cout< i=i+sqrt(t); } cout< } } 3.编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 #include int i,j; char a[20],b[10]; cout<<“请输入一个不大于10个字符的字符串:”< cin>>a; cout<<“请再输入一个不大于10个字符的字符串:”< cin>>b; for(i=0;i<10;i++) if(a[i]==') { j=i; break; } for(i=0;i<10;i++) { a[i+j]=b[i]; if(b[i]==') break; } cout<<“两字符串的连接得:”< cout< #include cin>>a;cout<<“请再输入一个不大于10个字符的字符串:”< cin>>b;cout<<“两字符串的连接得:”< 5.声明一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。 程序: #include char street[20];// 街道地址 char city[10];// 市 char prov[10];// 省 char post[7];// 邮政编码 int no;// 记录序号 public: employee(char [],char [],char [],char [],char [],int);void change_name();void display();};employee::employee(char n[],char s[],char c[],char p1[],char p2[],int num){ strcpy(name,n);strcpy(street,s);strcpy(city,c);strcpy(prov,p1);strcpy(post,p2);no=num;} void employee::change_name(){ char n[20];cout<<“记录”< 6.声明包含5个元素的对象数组,每个元素都是Employee类型的对象。 //声明包含5个元素的对象数组,每个元素都是Employee类型的对象。#include int Chinese;// 语文 int English;// 英语 int Sport;// 体育 int Num;// 序号 public: void N(int n){Num=n;} void M(int m){Math=m;} void C(int c){Chinese=c;} void E(int e){English=e;} void S(int s){Sport=s;} void display(){cout<<“输出序号”< cout<<“请依次输入序号、数学、语文、英语和体育成绩:”< cin>>n>>m>>c>>e>>s; date[i].N(n); date[i].M(m); date[i].C(c); date[i].E(e); date[i].S(s);} for(i=0;i date[i].display();} 实验六 类与对象 一、实验目的 1.掌握类的声明和使用。 2.掌握类的声明和对象的声明。 3.复习具有不同访问属性的成员的访问方式。 4.观察构造函数和析构函数的执行过程。 5.学习类的组合使用方法。 二、实验任务 1.声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,其中,rank为字符型,其值可以为P1、P2等;frequency为单位是MHz的整型数;voltage为浮点型的电压值。 公有成员函数包括:GetRank()、GetFrequency()、GetVoltage()用来获取等级、频率、电压的值;SetRank、SetFrequency、SetVoltage用来设置等级、频率、电压的值;run、stop中run里面要求输出“CPU开始运行!”;stop里面要求输出“CPU停止运行!”。 构造函数里面需要输出“构造一个CPU”,析构函数里面需要输出“析构一个CPU”。观察构造函数和析构函数的调用顺序。 程序://声明一个CPU类 #include freauency=f; voltage=v; cout<<“构造一个CPU!”< 实训可以说是一段激情燃烧的岁月,我对实训充满新鲜感。我终于抛开枯燥的C++控制台界面,拥抱绚丽多彩的操作窗口;我终于看清课本所学,乃纸上谈兵,只有实践训练,才能封狼居胥。 首先,说一说实训期间我的主要工作。经过小组分配,我和XXX主攻数据库方向。数据库对于我们来说可能是最难攻克的堡垒。尽管数据库对程序员来说是非常重要的,但是我们现在基本没有接触,没有人可以与你讨论对策。甚至一开始,连数据库的阵地在哪都不知道,数据库有什么样的能力也是鲜为人知。所以各个小组不惜耗费大量人力物力,决心把它拿下。 战役开始阶段,面临一个问题,是对ACCESS动武,还是对MySQL下手。经过和XXX的讨论,我们准备迎难而上,直捣MySQL。一是ACCESS简单,以后基本用不到了,二是MySQL非常流行,以后java 和网站开发都能看见他的身影。 战役决战阶段,经过网上资源支援,加上自己的战斗能力,艰苦卓绝地扫清了障碍,其中有MySQL的安装,VC++6.0的配置,头文件的放置位置,MySQL的操作,各种未知函数的调用以及各种莫名其妙的bug。之所以艰苦卓绝,那是因为每向前推进一步,需反复冲锋几十次,战斗惨烈程度看见一斑。 .战役扫尾阶段,在拿下几个重要函数的情况下,我们迅速组合他们,产生了所有操作函数,然后嵌入整个工程中来,整个工程神奇的得到重生。工程得到了解放。 总结此次大决战: 成功的方面:战斗小组合作比较愉快;我没有畏惧困难,敢于挑战强大的MySQL。 不足的方面:界面不太美观,按钮简单,原因是没有充分的进行小组分工,没有充分利用友军micromedia fireworks 的支援,我认为先有一个成员制作出初步方案,再通过组内审核,这种方式比较好。 得到的经验: (1)企业标准,长官说过一个新兵来报道,长官看他的战斗能力,看他的战斗成果,觉得不错,但是当发现if(a = =5)时,他立即辞退新兵,原因很简单,他没有实战经验,看见以企业的标准要求自己是多么重要; (2)编码规范,有了编码规范才能与小组的成员相互支援,没有编码规范,不但要孤零零战斗,而且有开出军籍的可能; (3)第一次知道小组中有这么多角色,这么多角色中总会有适合自己的; (4)正规的军队都有强大的组织能力,组员使用VSS可以清楚地了解友军的位置与运动方向。 战役时间:2011-8-11到2011-8-26篇5:c++课程设计总结
篇6:C++ 实验一总结报告
篇7:东软C++实训总结