c++学习笔记(无颜色的内容了解即可,有颜色的内容是重点)

1、<>和""表示编译器在搜索头文件时的顺序不同,<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录,""是表示从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。所以,系统头文件一般用<>,用户自己定义的则可以使用"",加快搜索速度。

2、

  • 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。
  • 类 - 类可以定义为描述对象行为/状态的模板/蓝图。
  • 方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
  • 即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。

3、

块注释符(/*...*/)是不可以嵌套使用的。

此外,我们还可以使用 #if 0 ... #endif 来实现注释,且可以实现嵌套,格式为:

#if 0
   code
#endif 

可以把 #if 0 改成 #if 1 来执行 code 的代码。

这种形式对程序调试也可以帮助,测试时使用 #if 1 来执行测试代码,发布后使用 #if 0 来屏蔽测试代码。

#if 后可以是任意的条件语句。

下面的代码如果 condition 条件为 tre 执行 code1 ,否则执行 code2。

#if condition
  code1
#else
  code2
#endif

4、typedef声明

typedef只是对已存在的类型增加一个类型名,而不创造新的类型。

可以使用typedef为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:

typedef type newname; 

例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:

typedef int feet;

现在,下面的声明是完全合法的,它创建了一个整型变量 distance:

feet distance;

5、枚举类型

枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。

如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。

创建枚举,需要使用关键字enum。枚举类型的一般形式为:

enum 枚举名{ 
     标识符[=整型常数], 
     标识符[=整型常数], 
... 
    标识符[=整型常数]
} 枚举变量;
    

如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始。

例如,下面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 "blue"。

enum color { red, green, blue } c;
c = blue;

默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。

enum color { red, green=5, blue };

在这里,blue的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1,但 red 的值依然为 0。

6、

左值:指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。

右值:术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。

7、类型转换

自动转换规则

  • 1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
  • 2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。     a、若两种类型的字节数不同,转换成字节数高的类型     b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  • 3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  • 4、char型和short型参与运算时,必须先转换成int型。
  • 5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。

强制转换规则

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型

8、静态变量

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围,说到底 static 还是用来隐藏的。虽然这种用法不常见。

PS:如果作为 static 局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

#include <iostream>
using namespace std;

int count = 1; //全局变量

int fun()
{
    static int count = 10; // 在第一次进入这个函数的时候,变量 count 被初始化为 10!并接着自减 1,以后每次进入该函数,count 的值是上一次函数运行之后的值
    return count--;        // 就不会被再次初始化了,仅进行自减 1 的操作;在 static 发明前,要达到同样的功能,则只能使用全局变量
}
 
//int count = 1; //全局变量
 
int main()
{
     cout<<"global  "<<"local staic"<<endl;
     for(; count <= 10; ++count)
        cout<<count<<"        "<<fun()<<endl;
     return 0;
}

运行结果

global  local staic
1        10
2        9
3        8
4        7
5        6
6        5
7        4
8        3
9        2
10        1

Process returned 0 (0x0)   execution time : 0.047 s
Press any key to continue.

并且,由此可见全局变量和局部静态变量 count 的作用域是不同的。

9、

在前面的学习中我们看到的输出没有 std::,而这一节出现了上面的代码。

std 是标准库函数使用的命名空间,是 standard(标准)的缩写。

using namespace std ,它声明了命名空间std,后续如果有未指定命名空间的符号,那么默认使用std,这样就可以使用cin、cout 等。

假设你不使用预处理using namespace std;,就要加上std::cin或者std::cout。

cin用于从控制台获取用户输入,cout用于将数据输出到控制台。

cin是输入流对象,cout是输出流对象,它们分别可以用>>和<<,是因为分别在其类中对相应运算符进行了重载。

10、指针

& (取地址运算符)返回操作数的内存地址。 *间接寻址运算符,返回操作数所指定地址的变量

例如

用int* a 声明变量a是指向int型变量的指针。赋值a=&b的含义是把变量b的地址存放在指针a中。表达式*a代表a指向的变量,而不仅仅是a指向的变量的值,*a=*a+1就是让a指向的变量自增1。甚至可以写成(*a)++,但是不能写成*a++,因为++的优先级高于*,*a++则被解释为*(a++)

11、函数返回数组

C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量

例子如下

#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
// 要生成和返回随机数的函数
int * getRandom( )
{
  static int  r[10];
 
  // 设置种子
  srand( (unsigned)time( NULL ) );
  for (int i = 0; i < 10; ++i)
  {
    r[i] = rand();
    cout << r[i] << endl;
  }
 
  return r;
}
 
// 要调用上面定义函数的主函数
int main ()
{
   // 一个指向整数的指针
   int *p;
 
   p = getRandom();
   for ( int i = 0; i < 10; i++ )
   {
       cout << "*(p + " << i << ") : ";
       cout << *(p + i) << endl;
   }
 
   return 0;
}

具体见链接http://www.runoob.com/cplusplus/cpp-return-arrays-from-function.html

猜你喜欢

转载自blog.csdn.net/qq_41626975/article/details/81981890