初入C++(一) c++中的一些基础和与c的一些区别

来源:互联网 发布:视频下载软件 vd 编辑:程序博客网 时间:2024/05/22 02:15

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;
或是
char *pstr = new char [50];

delete可以用于释放堆上的空间,语法如下:
delete p;delete [50] pstr;

5.命名空间

在C++中我们经常会碰到"using namespace"等字符,namespace就是命名空间,而using 属于声明;
命名空间的概念
 C++中采用单一的全局变量的命名空间,如果在一个空间中,两个变量或函数的名字一样,编译的时候就会冲突。命名空间就是为了解决C++中函数变量的命名冲突所采取的一种措施,能够解决多模块协同开发出现变量函数命名的冲突问题。
     在这里面可以把命名空间理解成文件夹,如果你在hel1这个文件夹中编辑两个hello.cpp肯定会出问题,但是如果一个在hel1,一个在hel2这个文件夹中p,这个就不会出现冲突。
 命名空间的必要性: 当程序比较大的时候,需要多人合作,命名空间就非常必要。
命名空间的定义
命名空间用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,这是最常用的命名空间,而不需要再引用该成员的命名空间。
   
#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++中允许同名函数的存在,但是参数必须不同:可以是参数个数不同,或参数个数相同、但类型不同 -- 这就是函数的重载。
#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),又称内嵌函数或者内置函数。
#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只是修饰函数向编译器提出内联请求,做不作为内联函数由编译器决定;