C++知识一篇就够了(一)

一、概述
之所以想写这篇小记,主要是因为最近有个学妹突然问我一些C++的基础概念,竟一时不知道怎么回答。想想刚毕业时候,这些概念性的东西都是信手拈来,现在工作两年了,反而概念模糊了,瞬间感觉就不好了。工作中虽然一直使用着C++,虽说对于这门语言不能说是精通,但作为一种工具,至少应付工作没出现过什么大问题。但确实很多概念性的东西,慢慢遗忘,有种张三丰问张无忌有没有记住武功的感觉,这么说其实只是想表达一下,妹子,妹子,学长不是个渣渣,只是太厉害了,嘿嘿!
开个玩笑,博大精深的C++,作为一名渣渣程序员,我时刻都保持着敬畏之心,更何况自己只处于会用阶段,很多高阶玩法还处于摸索阶段,路漫漫其修远兮,吾将上下而求索…
本总结为一个系列:主要包括:
1. 基础理论篇,C++在非面向对象上的扩展
2. 基础理论篇,C++面向对象编程的“术”
3. C++的“道”,面向对象编程思想
4. 设计模式

进入正题:
本文适合人群:
(1)新手对于C++的概括了解
(2)入门级别C++选手的复习总结
(3) C++大佬可以进来吐槽吐槽,批评指教小弟
二、基础理论篇,C++在非面向对象上的扩展
2.1 C++程序设计的特点
C语言是面向过程的,即可以简单的用以下公式来总结:
程序 = 过程+调用
C++是面向对象的,主要特征如下:
程序 = 对象+消息
面向对象程序的基本元素是对象:
(1)程序由类的定义和类的使用两部分组成
(2)程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关的方法完成相应 的操作。
(3)既然使用C++就要写出面向对象的程序,但是很多学过C语言的同学,刚学习C++的我,都是操着C++这把牛刀,宰小鸡。用C++来写面向过程的程序,实在是一种浪费…
关于面向对象的编程思想,如果有兴趣,请看我的另一篇博客:
这里着重介绍C++的“术”层面。

2.2 C++在“术”上面的使用
2.2.1 结构、联合、枚举名可以直接作为类型名
在C中,结构、联合、枚举名是不能直接作为类型名的,但是C++可以,再也不用定义了个结构体,还要去用tepdef 再搞一下,例如:

struct A{
	char a;
	char b;
};
A test;//正确,C++风格
struct A test;//C风格

2.2.1 const 修饰符
C语言中,习惯用#define 来定义常量,这种方式所定义的常量,只是在编译阶段做简单的字符替换,因此容易引起很多问题。
举个例子:
若某个头文件中定义了常量: #define FUN 10
而刚好引用该头文件的某.c文件有个函数名为:FUN_test();
那么 编译完了就变成了:10_test
凉凉…
但是C++使用const 定义常量,该常量是有类型的,且占有存储单元,避免了类似的错误…

const int A;

2.2.2 内联函数

inline int fun(int num){
	return num++;
}
void funb(){
	int A = 10;
	int B = fun(A);
}
编译完成后变成这样:
void funb(){
	int A = 10;
	{
		int num = A;
		B = num++;
	}
}

为什么要使用内联函数?
我们有些函数完成的操作很简单,这种情况下,如果封装成一个普通的函数,那么程序在调用时,必然会产生系统开销,使用内联函数,即将函数内部完全的插入调用处,如此便省去了系统的调用开销,提高了程序效率。但是当函数体较为复杂时候,不应该写成内联函数。
2.2.3 带有默认参数的函数

int test(int x=5,floate y = 10.2);
test();// == test(5,10.2);
test(3);// == test(3,10.2);
test(4,20.3)// == test(4,20.3);

2.2.4 函数的重载
在C语言中函数名必须不同,否则编译出错,但C++允许有相同的函数名的存在:

  1. 参数类型不同可以重载
  2. 参数个数不同可以重载
  3. 带有默认参数的函数,重载有可能会产生二义性;

2.2.4 作用域运算符::
在局部区域定义了的局部变量名字若与全局变量名相同,这在局部区域局部变量将覆盖全局变量,若要访问全局变量,则采用:

::var

2.2.4 联合的使用
联合可以使得一组变量拥有相同的内存地址,例如:

union data{
	int i;
	char b;
}
//无名联合
union{
	int i;
	char b;
}x;

2.2.5 强制类型转换

int B = 10;
double C = (double)B;//C风格
double C = double(B);//c++风格

2.2.6 new与delete
类似于C的malloc 和free,但是比C的更强大:
(1)使用C的malloc时候,必须计算出具体需要申请的字节数,常用运算符sizeof;但new 会根据类型自动计算,减少程序员出错的机会。
(2)new 会自动返回正确的类型,但malloc不会,malloc必须手动转换类型

int * p1 = new int[10];
int *p2 = new int(10);//分配内存同时初始化
delete p2;
delete []p1;

2.2.7 引用
给变量取一个别名:

int i = 5;
int &k = i;

引用作为函数参数:

void swp(int &a,int &b);

使用引用作为返回值:

int a= 5;
int & test(){
	return a;
}
test()=6;

除了将函数定义为一个引用,通常函数是不能直接作用在赋值运算符的左边的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值