c++与c不太相同的一些地方1
1、c++区别与java的一个地方:C++更多的是一种规范,不同时期的不同标准,提供了不同的语法要求。所以各个厂商在对C++的支持上也做得不尽相同,比如有些语法vs就支持gcc
就支持的差一些,而某些语法gcc支持,在vs上编译就通不过。Java除了语言之外更有一种产品的概念,所以支持规范都向下兼容,保证了更好的跨平台性。这是要指出的一个地方,所以我们可以发现C++11,C++98等等标准。
2、volatile 关键字。比如我们有可能写这样一个语句:
Int a = 3;
a+= 4;
a+= 5;
对于智能的编译器来讲,开始+=4,后来+=5,这种操作是可以合并的。
如果加上了volatile关键字:
Volatile int a = 3;
a + = 4;
a + = 5;
编译器就不再对该段代码进行优化。严格分步执行。
//详情参见:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html 关于volatile的描述。
3、还有一些马上就会常见的关键字:是在c中没有的概念:
比如bool,class,public,private,new,delete。
关于new跟delete的一些写法的注记:
先介绍在C里面的写法:
Int *p = (int *) malloc(sizeof(int));
*p = 10;
Printf(“%d\n”,*p);
Free(p);
同样是在堆内开辟空间,malloc需要.h头文件的支持。
而new作为嵌入在C++里面的一个关键字不需要头文件的支持,就可以直接使用。
写法:
Int *p = new int;
*p = 10;
Cout<<p<<endl;
Delete p;
关于创建数组:
Int *p = new int[10];
P[1] = 12;
Cout<<p[1]<<endl;
Delete []p;//这里一定要注意!!!
/*
注意点1:
因为按照创建的套路有可能会写成 delete p,这样就只释放了首地址对应的对内存空间。也就是p[0].
注意点2:
有可能写成:delete p[];
error: expected primary-expression before ']' token
delete p[];
^
他说缺少了一个基本的表达。那我们加上这个10看行不行。
error: type 'int' argument given to 'delete', expected pointer
delete p[10];
^
他说,整形参数被给到了delete,但是期望一个指针。所以这样的写法也是通不过的。
*/
示例代码:
#include <iostream>
using namespace std;
int main()
{
int *p = new int[3];
p[2] = 10;
cout<<p[2]<<endl;
delete []p;
return 0;
}
4、Inline 关键字。内联函数的意思。
Inline是一种建议,当程序代码量比较小的时候,就会把对应的内联函数直接转换成代码放到对应的执行体中,如果代码量过大,作为一种可以优化代码的编译器来讲他就还是以函数调用的方式进行,至于这个代码量和复杂的大小没有明确规定,是程序员的一种感觉。以及编一起的一种操作。所以inline是一种建议,而非必须,就跟之前也有一个关键字寄存器register他不一定被放到寄存器中,只是对编译器的一种建议,带来的代价就是并不能通过取地址方式来得到当前的这个变量。即使编译器没有把他放到寄存器中。
5、引用:
引入:我们知道这样并不能交换a、b的值。

#include <iostream>
using namespace std;
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1;
int b = 2;
swap(a,b);
cout<<"a = "<<a<<"\nb = "<<b<<endl;
return 0;
}
可以交换的方式:
指针方式:

#include <iostream>
using namespace std;
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 1;
int b = 2;
swap(a,b);
cout<<"a = "<<a<<"\nb = "<<b<<endl;
return 0;
}

引用方式:
#include <iostream>
using namespace std;
void swap(int &a1,int &b1){
int temp = a1;
a1 = b1;
b1 = temp;
}
int main()
{
int a = 1;
int b = 2;
swap(a,b);
cout<<"a = "<<a<<"\nb = "<<b<<endl;
return 0;
}
这里最好画图来描述。然后得到使用引用能提高代码的执行效率。
值得注意的是:
引用必须在声明的时候给出定义,否则这是无效的。
int a = 3;
Int &a1 = a;
这是可以的
但是下面这样写法就不行:
Int a = 3;
Int &a1;
a1 = a;
//这个写法就不行。
这些点是需要注意的。
5、函数,函数重载,缺省函数。
这里主要防止缺省函数带来的二义性。重载这个点还是比较重要的。需要掌握的点就是关于void这个关键字。如果函数参数没有的话在C++里面一定要写上void。而在c里面是不必要写的。这样也能想通,因为在c里面不存在重载这个概念,所以有没有参数,这里要求不是很严格。但是对于c++里面因为存在重载概念,所以有没有参数有什么参数都要写的非常清楚才可以。
模板函数这个要练一下。
#include <iostream>
template <class T>
T myAdd(T a, T b){
return a + b;
}
//int myAdd(int a, int b){
// return a + b;
//}
//double myAdd(double a, double b){
// return a + b;
//}
using namespace std;
int main(){
cout << "hello world" << endl;
cout << myAdd(3, 4) << endl;
cout << myAdd(3.14, 6.58) << endl;
system("pause");
return 0;
}
因为有了重载的概念,所以我们可以做 short char int long float double等等类型的加法,但是,这样我们就要写许许多多的函数,才可以,这样就很繁琐,所以,就出现了这样一个简化的方式,模板函数。只要你是我这个类型的我就能给你做加法。并且你给我什么类型的我就做什么运算。这既是模板函数,当然后面还有更加高级的应用。
6、引用这个东西要再背一下,这些东西要立刻反应不能想太久。
再来做一下swap这个练习。
//给我写的嘛~~~客观扫一眼就好啦~
#include <iostream>
void swap1(int a,int b){
int temp = a;
a = b;
b = temp;
}
void swap2(int *a1, int *b1){
int temp = *a1;
*a1 = *b1;
*b1 = temp;
}
void swap3(int &a1, int &b1){
int temp = a1;
a1 = b1;
b1 = temp;
}
using namespace std;
int main(){
int a1 = 3;
int b1 = 4;
cout << "交换前a1 = " << a1 << ",b1 = " << b1 << endl;
swap1(a1, b1);
cout << "交换后a1 = " << a1 << ", b1 = " << b1 << endl;
swap2(&a1, &b1);
cout << "交换后a1 = " << a1 << ", b1 = " << b1 << endl;
swap3(a1, b1);
cout << "交换后a1 = " << a1 << ", b1 = " << b1 << endl;
system("pause");
return 0;
}
引用作为函数参数,没有出入栈操作,所以效率高。
命名空间的使用。
举例:
#include <iostream>
//如果这里面没有 using namespace std;
namespace letben{
int func(int a, int b){
return a + b;
}
}
namespace instruction{
void instruction(void){
std::cout << "这个怎么说呢,因为叫李飞的人是在太多了,如果只在我家里,大家还可以愉快的叫我李飞\n但是放眼全国,一叫李飞,就可能乱套。如果调用李飞.吃饭,那么有男人,有女人,有饭量大有饭量小,导致二义性\n所以为了避免这种状况产生,就加了这样一层限定。表示谁里面的什么方法。\n" ;
}
}
int main(){
std::cout << "这里是命名空间的使用" << std::endl;
std::cout << letben::func(5, 8) << std::endl;
instruction::instruction();
system("pause");
return 0;
}
类的本质是结构+代码+继承封装多台的机制。
c++与c不太相同的一些地方1的更多相关文章
- c++与c不太相同的一些地方2
1.一般全局变量放到cpp 文件里面,而不是.h 里面.要不然容易乱套,这个乱几次就好了,先记住这样一种编码规范. 以为大家都引入就比较麻烦,但是实现起来就只有cpp里面才有.毕竟.h是要被包含的文件 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- (转)深入理解Java的接口和抽象类
原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...
- 深入理解Java的接口和抽象类(转)
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 关于SharePoint 2013的工作流(二)
摸索完了如何画流程实现功能接下来,就是如何配置和部署了.在添加工作流之前,肯定需要一个审批人的配置以及阀值等等的配置. 这个的实现基本上和以前的工作流一致.写法却不一样了,模板自带的都是用js实现的. ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- Android编程容易犯的错误之二
11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了, 所以每个工程都应该有日志的开关,通过查看日志 ...
- EnglishLeaning
今天看了些hadoop官方reference感觉自己词汇量和语法真是又回到解放前了.于是,痛下决心要好好学习英语.找到了一些学习的方法,自己记录下来,也和大家一起借鉴 努力目标: 掌握大量的计算机英语 ...
随机推荐
- 介绍并扩展Fitnesse的测试模块化机制:ScenarioTable
摘要:在验收测试框架Fitneese中,使用Scenario可以把最常用的测试步骤封装起来,从而达到模块化定义Fitnesse测试用例的能力.但Scenario仅限于封装Script测试步骤,Scri ...
- 设计模式_Decorator_装饰模式
形象例子: Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖 ...
- 笔记:1.css样式,最前边加 @charset "utf-8";是为什么2.js判断各种浏览器的方法
表明CSS文件的页面编码为UTF-8..如果这个CSS的文件编码也是UTF-8的话..那么在浏览器中看到的CSS文件的页面中中文的注释或者中文字体就可以正确显示为中文,如果CSS的文件编码和页面不一致 ...
- HDU 1024 DP Max Sum Plus Plus
题意:本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. kuangbin专题. dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + ...
- GCC编译源代码的四个步骤【转】
GCC编译C源代码有四个步骤:预处理---->编译---->汇编---->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序 ...
- Java语言速览:StackOverflow
关于 java Java(请不要与 JavaScript 搞混)是一种设计为与 Java 虚拟机 (JVM) 一起使用的多用途编程语言.一般将安装了相关工具可以开发并运行 Java 程序的电脑系统称为 ...
- 独树一帜的字符串匹配算法——RK算法
参加了雅虎2015校招,笔试成绩还不错,谁知初面第一题就被问了个字符串匹配,要求不能使用KMP,但要和KMP一样优,当时瞬间就呵呵了.后经过面试官的一再提示,也还是没有成功在面试现场写得.现将该算法记 ...
- 引爆公式让你的APP游戏成为下一个“爆款”
在2014年的移动互联网领域,“魔漫相机”是一款值得关注的产品.虽然没有腾讯.百度或阿里巴巴等大资源的支持,但是这款应用一上线就在中国市场发展迅猛,日下载量超过80万次,最高一日达300万次.类似的成 ...
- Android 画图类View与SurfaceView之学习
在开发游戏开发中,android相应的提供了几个重要的模块: 1.显示界面的视图: Android 提供 View 和 SurfaceView 2.控制游戏整体结构: android 提供 Acti ...
- UINavgation日常小bug-有兴趣的朋友可以看看
UINavgation日常 UINavgation 今天在做一个小Demo,发现一个Bug,挺有意思的,就是在你不断调用Navigation- (void)pushViewController:(UI ...