C++程序设计语言学习笔记(一)

本文是C++程序设计语言的学习笔记,重点介绍了C++的基础知识,包括C++的特性、相对于C的好处、基本数据类型、作用域、初始化、类型转换、函数、类等概念,强调了程序设计思想的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++程序设计语言

该书主要介绍C++语言的基础以及如何利用它进行程序设计。学习任何一本语言如果只沉浸在语言本身特征,你的收获会比较小,关键是程序设计思想。里面提到的一句话很重要“对于程序语言设计和设计技术的理解远比细节的理解更重要,而这种理解的根本是时间和实践”。一般程序设计都会有三个过程:分析、设计、编码。一般程序员开始的时候花在分析和设计上的时间较少,开发之初就上手编程,容易照成后期维护修改比较困难,这种程序员一般用10%分析,20%设计,30%编码,40%找bug加维护;对于一个高级程序员来说会花40%分析,40%设计,20%编码加维护

第一部分:C++基础

什么是C++?C++是

·           一种通用的程序设计语言,特别是面向对象程序设计

·           更好的C

·           支持数据抽象

·           支持面向对象程序设计

·           支持通用性程序设计

C++相对于C的好处:

· 完全兼容C

· 编程思路的改变:过程式编程>抽象编程

· 将数据和算法进行隐藏:信息隐藏

· 代码复用

· 模块编程

C++中的类型

· bool类型

占用1个字节

true:任何非0值或者非空指针;false:0或者空指针

true,可以转换为1;false转换为0

· char类型

占用一个字节

wchar_t:宽字符,一般和int一样大

· int类型

32或者64位系统上不同,一般为4或者8个字节

short、int、long->unsigned short,unsigned int, unsigned long

十进制 1;八进制:0123;十六进制:0x1bc

无符号数:12U

long:12L

· 浮点数-float、double

4或者8字节,一般使用double

1.23f

· void类型

表示没有对象,不能void x

可以声明void * p

· 作用域

一个变量的范围一般限制在{}之内,{}内的变量会屏蔽上一级别的同名变量

可以通过::x来访问全局的被屏蔽的变量

局部被屏蔽的变量不能被访问到

· 初始化

全局的、名字空间内或者静态对象会被适当的初始化为0,如果没有定义的话

局部变量或者在堆上声明的变量默认不会初始化,谨慎使用。

· const与指针

const char *p1:p1是一个指针指向常量char,表示p指向的内容不能改变,可以指向其他变量

char const *p2:同p1

char *const p3:p3是一个常量指针指向char,表示p只能指向某变量,不能改变,但是其指向的值可以改变

const char *const p4:

将声明从右向左读出来即可。

const有限制作用域的功效。在头文件里定义变量,限制该变量作用于该文件,static有类似功能

· 引用

指向一个变量:左值

const T&可以指向一个非左值,甚至非T类型的,其操作是先进行隐式类型转换为T,然后进行赋值,直到作用域结束时才结束

const double&x = 1

double tmp = double(x)

const double&x = tmp

· 结构体struct

不同类型变量的汇总

结构的大小不一定是所有变量的sizeof之和,可能会有一些对其操作,即保证 对int类型的倍数

· 运算符

尽量通过括号确定优先级

默认情况下,内存不足时,new对象时会抛出bad_alloc异常,可以通过try进行捕获

显示类型转换:

§  static_cast<T>、const_cast<T>、dynamic_cast<T>、reinterpret_cast<T>

· 函数

传值、传指针、引用

返回值:绝不不能返回局部变量的指针或者引用

默认参数:均要放置在参数列表的最后

· 名字空间

防止命名冲突和模块化

显式命名空间:namespace xx{}

隐式命名空间:namespace {}

重新命名名字空间:namespace ATT = AbcTT

命名空间组合和选择

§  名字查找:本空间内、直接显式声明、其他声明空间

· 程序组织

源文件

预处理-编译-连接-可执行程序

头文件里面应该放什么?

ODR:单一定义规则

extern “C”是一种连接约定,不是一种语言,表明应该按照C连接约定进行连接

· 类的定义

· 访问控制:private、public、protected

· 比较重要的几类函数:构造函数、赋值运算符、复制构造函数、析构函数

何时调用赋值运算符、何时调用复制构造函数?

§  一般而言对未初始化的变量完成初始化调用:复制构造函数,例如A a(b)、A a=b、f(a)?

§  对已经初始化的变量重新赋值调用:赋值操作符,A a,b; a=b

· 静态成员:必须在其他地方进行定义

· const成员函数,

即在成员后边添加const关键字,表明该函数不会改变对象状态,定义的时候也需要添加

const对象和非const对象均可以调用const成员函数,非const成员只能被非const对象调用

· this指针

一般成员为X*,const成员为const X*

如果需要在const成员函数里面,改变对象状态,可以通过const_cast<T>强制去掉this指针的const属性

但是如果对象本身就是const类型的,即const A a;此时便不能进行操作,可以通过定义mutable变量

mutable类型变量是指该变量不可能是const类型的

· 类和struct

不同点:类默认访问均为私有的,struct默认为公有的,其他基本无区别。

一般变量全部为公有时,考虑使用struct,其他使用class

· 构造函数和析构函数调用

局部对象,按照变量定义的顺序进行构造函数调用,按照定义顺序的逆顺序进行析构

自由区域的对象,在new时调用构造函数,delete时调用析构函数

类中的自定义对象初始化:在调用类本身的构造函数之前,会按照变量定义顺序依次初始化每一个成员变量。

§  成员初始化列表:变量无默认构造函数、常量变量、引用变量

自定义对象的数组和vector的初始化:有默认构造函数的类型才能定义,并且调用N次构造函数和析构函数

局部静态对象,在该变量被初次执行到的时候调用构造函数,并且按照静态对象声明的顺序在进程结束时调用析构函数

非局部存储变量:全局变量、名字空间变量、以及各个类的static变量,将会在main函数之前进行调用构造函数,在main结束之后调用析构函数,按照变量定义的顺序进行析构。

临时对象的定义:临时对象可能会出现在计算表达式过程中,在用到时创建,并且在构造完完整表达式之后结束。

对象的放置:

联合:不能有静态成员,并且不能包含带有构造函数或者析构函数的对象,因为编译器不知道要使用哪些变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值