C++ 教程 在线

1924C++ 数据结构

给楼上的第一个问题做一个答疑吧, C++ 中的 typedef 确实可以省略, 不是 vs2017 的问题。

C 语言的 struct 定义了一组变量的集合,C 编译器并不认为这是一种新的类型。

C++ 中的 struct 是一个新类型的定义声明, 所以可以省略 typedef, 定义变量的时候也可以省略 struct, 而不用向c语言那样没用 typedef 取新名字, 就需要用 struct 结构体名 这种形式定义变量。

1923C++ 数据结构

接着楼上讲的,我讲讲我遇到的吧。

  • 首先,我不知道是不是版本的问题,在vs2017的使用过程中,我发现C++的结构体关键字typedef可以直接省略,甚至不省略的话vs还会提示你省略。
  • 第二个是习惯上的,我最近在用C++实现一些数据结构,用了几次之后发现,如果在结构体能够完成目的的情况下就没必要去用类。
  • 第三点是C与C++结构体中前者不能有函数,后者可以有。

1922C++ 数据结构

类与结构体在 C++ 中只有两点区别,除此这外无任何区别。

  • (1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。
  • (2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。
  • (3)class 可以定义模板,而 struct 不可以。

更多内容参考:结构体变量和结构体类型的定义

1921C++ 基本的输入输出

输入输出流中的函数(模板):

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    cout<<setiosflags(ios::left|ios::showpoint);  // 设左对齐,以一般实数方式显示
    cout.precision(5);       // 设置除小数点外有五位有效数字 
    cout<<123.456789<<endl;
    cout.width(10);          // 设置显示域宽10 
    cout.fill('*');          // 在显示区域空白处用*填充
    cout<<resetiosflags(ios::left);  // 清除状态左对齐
    cout<<setiosflags(ios::right);   // 设置右对齐
    cout<<123.456789<<endl;
    cout<<setiosflags(ios::left|ios::fixed);    // 设左对齐,以固定小数位显示
    cout.precision(3);    // 设置实数显示三位小数
    cout<<999.123456<<endl; 
    cout<<resetiosflags(ios::left|ios::fixed);  //清除状态左对齐和定点格式
    cout<<setiosflags(ios::left|ios::scientific);    //设置左对齐,以科学技术法显示 
    cout.precision(3);   //设置保留三位小数
    cout<<123.45678<<endl;
    return 0; 
}

测试输出结果:

123.46
****123.46
999.123
1.235e+02

其中 cout.setf 跟 setiosflags 一样,cout.precision 跟 setprecision 一样,cout.unsetf 跟 resetiosflags 一样。

setiosflags(ios::fixed) 固定的浮点显示 
setiosflags(ios::scientific) 指数表示 
setiosflags(ios::left) 左对齐 
setiosflags(ios::right) 右对齐 
setiosflags(ios::skipws 忽略前导空白 
setiosflags(ios::uppercase) 16进制数大写输出 
setiosflags(ios::lowercase) 16进制小写输出 
setiosflags(ios::showpoint) 强制显示小数点 
setiosflags(ios::showpos) 强制显示符号 

cout.setf 常见的标志:

标志 功能
boolalpha 可以使用单词”true”和”false”进行输入/输出的布尔值.
oct 用八进制格式显示数值.
dec 用十进制格式显示数值.
hex 用十六进制格式显示数值.
left 输出调整为左对齐.
right 输出调整为右对齐.
scientific 用科学记数法显示浮点数.
fixed 用正常的记数方法显示浮点数(与科学计数法相对应).
showbase 输出时显示所有数值的基数.
showpoint 显示小数点和额外的零,即使不需要.
showpos 在非负数值前面显示”+(正号)”.
skipws 当从一个流进行读取时,跳过空白字符(spaces, tabs, newlines).
unitbuf 在每次插入以后,清空缓冲区.
internal 将填充字符回到符号和数值之间.
uppercase 以大写的形式显示科学记数法中的”e”和十六进制格式的”x”.

iostream 中定义的操作符:

操作符 描述 输入 输出
boolalpha 启用boolalpha标志
dec 启用dec标志
endl 输出换行标示,并清空缓冲区
ends 输出空字符
fixed 启用fixed标志
flush 清空流
hex 启用 hex 标志
internal 启用 internal 标志
left 启用 left 标志
noboolalpha 关闭boolalpha 标志
noshowbase 关闭showbase 标志
noshowpoint 关闭showpoint 标志
noshowpos 关闭showpos 标志
noskipws 关闭skipws 标志
nounitbuf 关闭unitbuf 标志
nouppercase 关闭uppercase 标志
oct 启用 oct 标志
right 启用 right 标志
scientific 启用 scientific 标志
showbase 启用 showbase 标志
showpoint 启用 showpoint 标志
showpos 启用 showpos 标志
skipws 启用 skipws 标志
unitbuf 启用 unitbuf 标志
uppercase 启用 uppercase 标志
ws 跳过所有前导空白字符

iomanip 中定义的操作符:

操作符 描述 输入 输出
resetiosflags(long f) 关闭被指定为f的标志
setbase(int base) 设置数值的基本数为base
setfill(int ch) 设置填充字符为ch
setiosflags(long f) 启用指定为f的标志
setprecision(int p) 设置数值的精度(四舍五入)
setw(int w) 设置域宽度为w

1920C++ 日期 & 时间

vs2017 上使用安全方法:

#include <iostream>
#include <ctime>

using namespace std;

#define TIMESIZE 26

int main() {
    // 时间
    time_t now = time(0);
    char dt[TIMESIZE];
    errno_t err;
    err = ctime_s(dt, TIMESIZE, &now);
    cout << "local time: " << dt << endl;
    cout << "timestamp: " << now << endl;
    struct tm ltm;
    localtime_s(<m, &now);
    cout << "年: " << 1900 + ltm.tm_year << endl;
    cout << "月: " << 1 + ltm.tm_mon << endl;
    cout << "日: " << ltm.tm_mday << endl;
    cout << "时间: " << ltm.tm_hour << ":";
    cout << ltm.tm_min << ":";
    cout << ltm.tm_sec << endl;
    return 0;
}