1.定义变量的位置
在c中,所有的局部变量都必须在函数的开头定义。
而在c+中却不是这样的强求,只要在使用该变量之前定义就可以。
2.c++中的波尔类型(bool)
只有两种情况 就是0和1;掌握bool(波尔)、int(整型)、pointer(指针)、float(实型)这积累数据与0的比较,直接看demo
#include <iostream>
using namespace std;
int main()
{
bool a = false;
int b = 5;
float c = 0.01;
char *d = NULL;
if (a)
{
cout<<"a = 1"<<endl;
}
else//(!a)
{
cout<<"a = 0"<<endl;
}
if (b == 0)
{
cout<<"b = 0"<<endl;
}
else
{
cout<<"b != 0"<<endl;
}
if ((c > -0.000001) && (c < 0.000001))
{
cout<<"c = 0"<<endl;
}
else if (c < -0.000001)
{
cout<<"c < 0"<<endl;
}
else
{
cout<<"c > 0"<<endl;
}
if (NULL == d)
{
cout<<"d = NULL"<<endl;
}
else
{
cout<<"d != NULL"<<endl;
}
return 0;
}
3.c中的struct结构体与c++中的class类和对象
#include <iostream>
using namespace std;
struct student{
char *name;
int age;
float score;
};
int main()
{
struct student stu1;
stu1.name = "xiaoming";
stu1.age = 19;
stu1.score = 59.8;
printf("%s %d %6.3f\n", stu1.name, stu1.age, stu1.score);
return 0;
}
显然c++的类和对象更方便,功能也更强大。但是要记牢class的用法,和特点
#include <iostream>
using namespace std;
class student{
public :
char name[24];
//char *name;
int age;
float score;
void say()
{
printf("name:%s\nage:%d\nscore:%6.3f\n", name, age, score);
//cout<<"name = "<<name<<"\nage = "<<age<<"\nscore = "<<score<<endl;
}
};
int main()
{
class student stu1;
strcpy(stu1.name, "xiaoming");
stu1.age = 19;
stu1.score = 59.8;
stu1.say();
return 0;
}
4.在堆上申请空间和释放new和delete
在c中是用malloc和free来在堆上申请空间和释放空间。
在c++中也有同样的操作,是用new和delete。切记在申请和释放空间的函数中不要混用,一定要成对出现!例如不能吧new和free用在一起。
new申请空间成功后返回首地址。
语法:指针变量 = new 数据类型;
指针变量 = new 数据类型[长度]。
例如:
int *p;
p = new int;
或是
delete可以用于释放堆上的空间,语法如下:
char *pstr = new char [50];
delete p;
delete [50] pstr;
5.命名空间
在C++中我们经常会碰到"using namespace"等字符,namespace就是命名空间,而using 属于声明;
命名空间的概念
C++中采用单一的全局变量的命名空间,如果在一个空间中,两个变量或函数的名字一样,编译的时候就会冲突。命名空间就是为了解决C++中函数变量的命名冲突所采取的一种措施,能够解决多模块协同开发出现变量函数命名的冲突问题。
在这里面可以把命名空间理解成文件夹,如果你在hel1这个文件夹中编辑两个hello.cpp肯定会出问题,但是如果一个在hel1,一个在hel2这个文件夹中p,这个就不会出现冲突。
命名空间的必要性: 当程序比较大的时候,需要多人合作,命名空间就非常必要。
命名空间的概念
C++中采用单一的全局变量的命名空间,如果在一个空间中,两个变量或函数的名字一样,编译的时候就会冲突。命名空间就是为了解决C++中函数变量的命名冲突所采取的一种措施,能够解决多模块协同开发出现变量函数命名的冲突问题。
在这里面可以把命名空间理解成文件夹,如果你在hel1这个文件夹中编辑两个hello.cpp肯定会出问题,但是如果一个在hel1,一个在hel2这个文件夹中p,这个就不会出现冲突。
命名空间的必要性: 当程序比较大的时候,需要多人合作,命名空间就非常必要。
命名空间的定义
命名空间用namespace定义,格式如下:
namespace 命名空间名
{
命名空间生命内容
}
命名空间用namespace定义,格式如下:
namespace 命名空间名
{
命名空间生命内容
}
看demo。
#include <iostream>
using namespace std;
namespace nsa{
void print()
{
cout<<"nsa"<<endl;
}
}
namespace nsb{
void print()
{
cout<<"nsb"<<endl;
}
}
int main()
{
nsa::print();
nsb::print();
return 0;
}
其中的::是域操作符。
(1)using 声明
using声明可以出现在全局域和任意命名空间中,也可以出现在局部域中。
using namespace_name::name;
一旦使用using声明,就可以直接引用命名空间中的成员,而不需要再引用该成员的
命名空间。
命名空间std,这是最常用的命名空间,而不需要再引用该成员的命名空间。
在using 指令中,using后面必须跟关键字namespace,而且最后必须为命名空间名;
using 声明中,关键字后面没有namespace, 后面必须为命名空间的成员名。
using namespace_name::name;
一旦使用using声明,就可以直接引用命名空间中的成员,而不需要再引用该成员的
命名空间。
命名空间std,这是最常用的命名空间,而不需要再引用该成员的命名空间。
#include <iostream>
using std :: cin;//using声明,表明要引用标准库std中的成员cin;
using std :: string;//using声明,表明要引用标准库std中的成员string;
using std :: endl;
int main()
{
string temp;
cin>>temp;
std :: cout<<temp<<endl;
return 0;
}
在using 指令中,using后面必须跟关键字namespace,而且最后必须为命名空间名;
using 声明中,关键字后面没有namespace, 后面必须为命名空间的成员名。
(2)using的作用域
#include <iostream>
using namespace std;
namespace nsa{
int a = 5;
}
namespace nsb{
float a = 5.55;
}
int main()
{
{
using namespace nsa;
cout<<"nsa a = "<<a<<endl;//using指令,使用nsa
}
{
using namespace nsb;
cout<<"nsb a = "<<a<<endl;//using指令,使用nsb
}
return 0;
}
6.函数的重载
c++中允许同名函数的存在,但是参数必须不同:可以是参数个数不同,或参数个数相同、但类型不同 -- 这就是函数的重载。
1) 内联函数不能含有循环语句,swtich语句;
2) 内联函数必须在调用之前声明和定义;
3)内联函数不能指定抛出异常类型;
4)inline只是修饰函数向编译器提出内联请求,做不作为内联函数由编译器决定;
#include <iostream>
using namespace std;
int max(int a, int b);
int max(int a, int b, int c);
double max(double a, double b);
int main()
{
int n;
int a = 2;
int b = 3;
int c = 5;
double z;
double x = 55.5;
double y = 66.6;
n = max(a, b);
cout<<"a = "<<a<<" b = "<<b<<" max = "<<n<<endl;
z = max(x, y);
cout<<"x = "<<x<<" y = "<<y<<" max = "<<z<<endl;
n = max(a, b, c);
cout<<"a = "<<a<<" b = "<<b<<" c = "<<c<<" max = "<<n<<endl;
return 0;
}
int max(int a, int b)
{
return a > b ? a : b;
}
int max(int a, int b, int c)
{
int temp;
temp = a > b ? a : b;
return temp > c ? temp : c;
}
double max(double a, double b)
{
return a > b ? a : b;
}
7.带默认值的形参
C++规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值,那么它后面的所有形参都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。
简而言之,就是,如果一个函数的形参中,有一个形参是没有默认值的,那么他的左边的形参也不能有默认值。
默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在以后设计类时你将发现,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。
例如:
void func(int a, double b = 5.5, int c = 3);//合法
void func1(int a = 1, double b = 5.5, int c = 3);//不合法
看demo
#include <iostream>
using namespace std;
void func(int x, int y = 0, int z = 0)
{
cout<<x<<","<<y<<","<<z<<endl;
}
int main()
{
int x, y, z;
cout<<"x,y,z:"<<endl;
cin>>x>>y>>z;
func(x);
func(x, y);
func(x, y, z);
return 0;
}
8.内联函数inline
函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。
如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
#include <iostream>
using namespace std;
inline int max(int a, int b);
int main()
{
int a[10];
cout<<"please input 10 numbers :\n"<<endl;
int i;
for (i = 0; i < 10; i++)
{
cin>>a[i];
}
int temp = a[0];
for (i = 0; i < 10; i++)
{
temp = max(temp, a[i]);
}
cout<<"the max number of the 10 numbers is "<<temp<<endl;
return 0;
}
inline int max(int a, int b)
{
return a > b ? a : b;
}
说明:1) 内联函数不能含有循环语句,swtich语句;
2) 内联函数必须在调用之前声明和定义;
3)内联函数不能指定抛出异常类型;
4)inline只是修饰函数向编译器提出内联请求,做不作为内联函数由编译器决定;