C++ 第一篇

C++ 第一篇

一 c++ 程序编译

1. 编译方式

1.1 gcc xx.cpp -lstdc++
1.2 g++ xx.cpp // 推荐

2. c++ 文件拓展名

.cpp // 推荐
.cc
.cxx
.C

3. 头文件

#include
----> c++ 中I/O 相关类型,对象,函数都在该头文件中
-----> c++ 中大多数头文件没有.h 后缀
注: C++ 中也可以用标准C库中的内容,同时C++ 提供了一套不带“.h”的替换版本

#include <stdio.h> —> #include
#include <stdlib.h> —> #include
#include <string.h> —> #include

只是针对标准C库,对于unix c 中的一些库文件,没有这样的替换
标准c++ 头文件所在的路径
在 /usr/include/c++/5.4.0/cstdio

4. 标准的输入和输出

4.1 使用cout 表示标准输出 // printf
4.2 使用cin 表示标准输入 // scanf
cout 标准输出 表示屏幕 << 表示数据流向
cin 可以理解为标准输入设备 >> 表示数据流向

二 命名空间(名字空间)

1.名字空间的作用
  1. 避免名字冲突
  2. 划分逻辑单元
2. 名字空间定义

namespace 空间名 {
名字空间成员1 ;
名字空间成员2 ;

}
名字空间成员可以是全局变量,全局函数,类型,名字空间。

名字空间成员使用
  1. 通过作用域限定操作符 ::
    空间名::要访问的成员
    eg : std::cout 使用标准名字空间里面的成员cout

  2. 名字空间指令
    using namespace 空间名;
    注: 在该条指令以后的代码中,指定空间里面的成员都可见,可以直接使用,省略“空间名::"
    eg : using namespace std;
    以后的代码中可以省略 std::

  3. 名字空间声明
    using 命名空间:: 要访问的成员;
    注: 将名字空间中特定的一个成员引入到声明的作用域中,在该作用域中访问这个成员就如同访问自己的成员一样,可以直接访问。省略了”空间名::“

  4. 全局作用域和无名名字空间
    4.1 没有放在任何名字空间的成员,属于全局作用域,可以直接访问。但是如果和局部变量的成员名字相同,将优先访问局部的成员。这是如果还需要访问全局作用域的成员,可以通过”:: xx“显式访问。
    4.2 定义名字空间可以没有名字。即无名名字空间(匿名空间)。无名空间里的成员和全局作用域一样,知识被限制在当前文件中使用。
    :: func();

  5. 名字空间合并
    定义名字空间时,如果名字一样,将会合并为同一个名字空间。
    namespace ns{ 1.cpp
    void func1(void){…}
    }

namespace ns{ 2.cpp
void func2(void){…}
}
两个会合并为同一个名字空间。

3. c++ 结构体联合体和枚举
3.1 C++ 结构体中可以定义函数 ,成为成员函数(方法),在成员函数中可以直接访问结构体中的其他成员。

C++ 中结构体
struct Http{

};
在C 语言中
使用该结构体需要
struct Http http_1;
但是C++ 中可以直接
Http http_1;

#include <iostream>

using namespace std;

struct Teacher{
	//
	char name[20];
	int age;
	double salary;
	//
	void who(void)
	{
		cout<<"name="<< name<< "age="<< age<< "salary="<<salary<<endl;
	
	}
};

int main()
{
	Teacher wang={"wangxiao",45,880.5};
	wang.who();
	Teacher * pt = &wang;
	pt->who();

}
3.2 c++ 联合体

3.2.1 定义联合体可以省略union 关键字
3.2.2 c++ 支持匿名联合

#include <iostream>
#include <cstdio>
using namespace std;


int main()
{
	union{ // 匿名联合
		unsigned int ui;
		unsigned char uc[4];
	};

	ui = 0x12345678;
	for(int i=0; i<4; i++)
	{
		printf("%#x ", uc[i]);
	}
	printf("\n");
}

注意: %# 表示显示进制 x 表示16进制。
现在计算机内存大多数是小尾端。

3.3 枚举
  1. 定义枚举变量时,可以省略enum 关键字
  2. C++ 枚举被看作独立的数据类型,不能当作整型变量使用。
enum STATE {SLEEP,RUN,STOP};
/*enum*/ STATE ai_FUNC()
{
	....
	return SLEEP/RUN/STOP;
}
STATE a = STOP; // OK 
STATE a = 2; //  error 

四 字符串

4.1 c 语言中的字符串

常量字符串 “hello”
字符指针 char *
字符数组 char []
在这里插入图片描述

#include <stdio.h>

int main()
{
	char * str1 = "hello";
//	*str1 = "h"; // error
	char str2[] = "well";
	str2[0] = 'p';
	printf("%s\n",str2);
	strcpy(str1,str2); //  error
	strcpy(str2,str1); // ok 
	strcpy(str2,"tiger");// Cross border risk

	str1 = str2; // ok  
	str2 = str1; // error
}

  1. char * str1 = “hello”; 这一句表示在数据段中定义了一个字符串“hello”, 然后指针 str1 指向这个字符串“hello”;
  2. *str1 = “h”; // error 这一句话会出错。 因为 str1 指向的是数据段中的内容,数据段中的内容是只读的。因此相当于要修改数据段中的内容,出现错误。strcpy(str1,str2); 与这个的错误原因是相同的。
  3. char str2[] = “well”; 表示在数据段中有“well”字符串,然后通过copy,将“well” copy到栈中。str2 是栈中的一个数组变量,其中放的是“well”.
  4. str2[0] = ‘p’; 是正确的。因此栈中的数据是可以修改的。strcpy(str2,str1); // ok 的原因与这个相同
  5. strcpy(str2,“tiger”);// Cross border risk 这个是有越界的风险。因为str2 的长度为5 但是 tiger 的长度是6。 strcpy 是直到 /0 才会停止,因此可能发生数组越界风险。
  6. 字符串指针是变量,可以修改指针的指向,所以str1 = str2; // ok 是正确的。
  7. str2 = str1; // error 这个是错误的。 因为 数组的名字相当于一个常量的指针,指向的内容不能修改。
4.2 C++ 中的字符串

C++ 中的字符串,同时增加了string 类型转换表示字符串

  1. 定义字符串
    string str; // 定义空字符串
    string str = “hello”; // 定义同时初始化
    // 下面两种写法,运行结果和上面相同
    string str(“hello”);
    string str = string(“hello”);

  2. 字符串的copy 操作 =
    string str1 = “hello”;
    string str2 = “welldone”;
    str1 = str2; // 拷贝
    c++ 的字符串拷贝操作是不会有越界风险。如果长字符串copy 给短的字符串,会将短字符串的内存释放,然后申请一段长的空间,然后将字符串copy 过去。
    3) 字符窜的链接操作 + +=
    string str1 = “wang”;
    string str2 = “fei”;
    string str3 = str1 + str2;
    cout<< str3<<endl; // wangfei
    str1 += str2;
    cout << str1 <<endl; // wangfei

  3. 字符串的比较 == != > < >= <=
    字符串比较的是字符串的首字母的ASCII 码值
    5) 字符串使用的随机访问 []
    string str = “hello world”;
    str[0] = ‘H’;
    str[6] = ‘W’;
    注意长度不能越界
    6) 成员函数
    size()/length() // 获取字符串的长度
    string str = “hello”;
    str.size() // 5
    str.length()// 5


c_str() // 获取C 风格的字符串 const char *
string str = “hello”;
cout<< strlen(str.c_str())<< endl; // error

练习:

  1. 使用 string 表示字符串,从键盘输出字符串,统计其中 ‘w’/ ‘W’ 的个数。
#include <iostream>
using namespace std;

int main()
{
	string str; 
	cin >> str;
	int w_num = 0;
	for(int i = 0; i< str.length(); i++)
	{
		if ('W'== str[i] || 'w' == str[i])
		w_num++;
	}
	cout << "the num of w ="<< w_num<<endl;
}
  1. 使用string 字符串,从键盘中输入,然后将字符串反转,输出到屏幕上。
    例如 : 输入 abcd
    输出 dcba
#include <iostream>
using namespace std;

int main()
{
	string str; 
	cin >> str;
	int len = str.length();
	for(int i = 0; i < (len /2); i++)
	{
		str[i] = str[i]^str[len-1-i];
		str[len-i-1]= str[i]^str[len-1-i];
		str[i] = str[i]^str[len-1-i];
	}
	cout << str <<endl;
}

五 C++ 中的bool

  1. bool 类型在C++ 中是基本类型,专门表示逻辑值 true /false;
  2. bool 类型在内存中占一个字节。: 1 true 0 false
    bool func () {
    return true/false;
    }
  3. bool 类型的变量可以接收任意类型的表达式结果, 其值为0 表示假 非0 表示真
bool b = true;
char * p = NULL; //  (void*)0
b = p ; // 此时 b 为0, 因为*p 指向 空指针 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值