c++基础(1)——语法基础

目录

1. 输入,输出

2. new内存分配和delete 内存释放

3. 引用

4. 内联函数

5. typedef 给已有的类型进行重命名

6. 全局变量,局部变量,const 变量,static 静态变量,       静态函数等问题

一. const 基础知识

二. 全局变量与局部变量

7. 函数重载(Function Overload)

8. try catch 异常处理

9.  this 指针的使用

10. 命名空间


1. 输入,输出

#include <iostream>

//using namespace std;

int main()
{
    std::cout<<"enter two numbers: "<<std::endl;
    int v1,v2;
    std::cin>>v1>>v2;
    std::cout << "two num sum of " <<v1<<"+"<<v2<<" is:"<<v1+v2<<std::endl;

    return 0;
}

2. new内存分配和delete 内存释放

new 内存分配
//动态分配内存空间
int *p=new int[10];
int *p=new int;
int *p=new int(1024);
string *q=new string[5];

//动态释放空间
delete [] p;
delete [] q;

3. 引用

引用可以看作一个已定义变量的别名

普通引用在声明时必须用其它的变量进行初始化,
引用作为函数参数声明时不进行初始化

引用在C++中的内部实现是一个常指针,因此引用所占用的空间大
小与指针相同
Type& name  ——> Type* const name

int ival=1024;
int &refval=ival;

const int ival=1024;
const int &refval=ival;
void main01()
{
int a = 10; //c编译器分配4个字节内存。。。a内存空间的别名
int &b = a; //b就是a的别名。。。
a =11; //直接赋值
{
int *p = &a;
*p = 12;
printf("a %d \n",a);
}
b = 14;  
printf("a:%d b:%d", a, b);
system("pause");

 

4. 内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求

内联函数在最终生成的代码中是没有定义的
C++编译器直接将函数体插入在函数调用的地方,因此,内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

C++中内联编译的限制:
不能存在任何形式的循环语句  
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取址操作
函数内联声明必须在调用语句之前

inline const string &shorterString(const string &s1,const string &s2)
{
    return s1.size()<s2.size()?s1:s2;
}

结论:
1)内联函数在编译时直接将函数体插入函数调用的地方
2)inline 只是一种请求,编译器不一定允许这种请求
3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

 

5. typedef 给已有的类型进行重命名

typedef  int  int32;
int32 i=4;

6. 全局变量,局部变量,const 变量,static 静态变量,
       静态函数等问题

一. const 基础知识

int main()
{
    const int a;
    int const b;
    const int *c;
    int * const d;
    const int * const e ;
    return 0;
}

Int func1(const )
初级理解:const 是定义常量==》const 意味着只读
含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c 是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e 一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
Const 好处
//合理的利用 const,
//1 指针做函数参数,可以有效的提高代码可读性,减少 bug;
//2 清楚的分清参数的输入和输出特性
int setTeacher_err( const Teacher *p)
Const 修改形参的时候,在利用形参不能修改指针所向的内存空间

二. 全局变量与局部变量

#include <iostream>
int a;

int main()
{
    float a;
    a=3.14;

    ::a =6;
    cout<<"local variable a="<< a <<endl;
    cout<<"global variable a="<< ::a <<endl;
    return 0;
}

结果:

local variable a=3.14
global variable a=6

 

7. 函数重载(Function Overload)

函数重载概念
  用同一个函数名定义不同的函数
  当函数名和不同的参数搭配时函数的含义不同


函数重载的判断标准
  函数重载至少满足下面的一个条件:
  参数个数不同
  参数类型不同
  参数顺序不同

函数返回值不是函数重载的判断标准

int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
int main()
{
int c = 0;
c = func(1);
printf("c = %d\n", c);
c = func(1, 2);
printf("c = %d\n", c);
c = func("12345");
printf("c = %d\n", c);
printf("Press enter to continue ...");
getchar();
return 0;
}

结果:

结论:

编译器调用重载函数的准则
  轻松入门 实战应用 传智播客 C++课程
  将所有同名函数作为候选者
  尝试寻找可行的候选函数
  精确匹配实参
  通过默认参数能够匹配实参
  通过默认类型转换匹配实参
  匹配失败
  最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
  无法匹配所有候选者,函数未定义,编译失败

函数重载的注意事项
  重载函数在本质上是相互独立的不同函数(静态链编)
  重载函数的函数类型是不同的
  函数返回值不能作为函数重载的依据
  函数重载是由函数名和参数列表决定的

8. try catch 异常处理

 

9.  this 指针的使用

 

10. 命名空间

一.namespace,是指标识符的各种可见范围,例如:<iostream>和<iostream.h>

1)当使用<iostream.h>时,相当于在 c 中调用库函数,使用的是全局命名空间,也就是
早期的 c++实现;
2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std;
这样才能正确使用 cout。

二. namespace 的三种用法

1、直接指定标识符。例如 std::ostream 而不是 ostream。完整语句如下: std::cout <<  
std::hex << 3.4 << std::endl;
2、使用 using 关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用 using namespace std; 例如: using namespace std;这样命名空间
std 内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句
轻松入门 实战应用 传智播客 C++课程
可以如下写: cout <<hex << 3.4 << endl;

三. C++命名空间编程

namespace NameSpaceA
{
    int a = 0;
}
namespace NameSpaceB
{
    int a = 1;
    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}
int main()
{
    using namespace NameSpaceA;
    using NameSpaceB::NameSpaceC::Teacher;
    printf("a = %d\n", a);
    printf("a = %d\n", NameSpaceB::a);
    NameSpaceB::NameSpaceC::Teacher t2;
    Teacher t1 = {"aaa", 3};
    printf("t1.name = %s\n", t1.name);
    printf("t1.age = %d\n", t1.age);
    system("pause");
    return 0;
}

结果:

a = 0
a = 1
t1.name = aaa
t1.age = 3

结论:

1) 当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用 namespace std;
这样才能正确使用 cout。若不引入 using namespace std ,需要这样做。std::cout。
2) c++标准为了和 C 区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
3) C++命名空间的定义: namespace name { … }
4) using namespace NameSpaceA;
5) namespce 定义可嵌套

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值