C++学习笔记1

本文深入解析C++编程的基本概念,如对象、类、封装、继承和多态性,详细介绍了C++的基础知识,包括命名空间的使用、新的I/O流特性、作用域运算符的功能、结构体、共用体和枚举的定义方法,以及const修饰符的应用。通过实例演示了如何在实际编程中运用这些概念和技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


目录

  • 一、C++基本概念

1、对象
2、类
3、封装、继承、多态性

  • 二、C++基础知识

1、命名空间
2、新的I/O流
3、作用域运算符::
4、C++中的结构体、共用体和枚举
5、const修饰符


  • 一、C++基本概念

1、对象

面向对象的思想是把世界看做是由具有行为的各种对象组成, 任何对象都具有某些特征和行为(数据和算法),
即特征就是数据, 行为就是算法, 算法就是对象的函数。

对象就是一个变量,包含数据和方法
2、类

具有共性的实体的抽象,其本质是自定义数据类型;类的设计是关键一步,直接影响到代码重用和程序扩充

寻求一个大系统中事物的共性, 将具有共性的系统确定为一个类;设计类要有一个明确的目标, 一个好的类应该是容易理解和使用的

3、封装、继承、多态性

封装:把数据保护起来, 用类的方法对数据进行操作

继承:防止重复开发;我们设计好一个类, 再设计另外一个类的时候, 第 2 类和第 1 个类有共性, 第 2 个类可以继承第 1 个类的属性及方法。类间具有共享特征(包括数据和程序代码的共享)、类间具有新增部分(包括非共享的数据和程序代码)、类间具有层次结构

多态:多态就是有多种状态。 一个函数可以完成多个功能就叫多态。

           在 c 语言中: 函数名是不能重名的int abs(int)  

           在 C++中: 函数名是可以重名的  int abs(int)    float abs(float)   通过传递不同的参数决定调用哪个 abs 函数。

在 C++中确定一个函数的入口地址, 不仅仅是通过函数名的。 C++中确定一个函数的入口地址是通过函数名和参数
来共同确定的, 这两者共同决定一个函数的入口地址。


  • 二、C++基础知识

1、命名空间

所谓命名空间, 是指标识符(变量或函数等) 的各种可见范围。在编程中如果在一个函数中定义两个名字相同的变量, 便会报重定义错误。 命名空间就是为解决这一类问题解决的

#include<iostream>
//i:input
//o:output
int main()
{
    std::cout<<"hello C++"<<std::endl; //std命名空间中的cout
    //std::endl 代表换行
    // <<代表流向
    return 0;
}

命名空间的定义:

namespace myName{
                                  //namespace member
                                   } 注意此处没有分号
namespace CompanyA{
                                      void fun()
                                                   { }

                                      int num;
                                      }

CompanyA::fun(); CompanyA::num=100;
 

#include<iostream>
//A 命名空间
namespace A{
    int num;
    void fun(void)//C++中如果没有参数, 要填写 void, 不能空着
    {
        std::cout<<"A 中的 fun"<<std::endl;
    }
} 
//B 命名空间
namespace B{
    int num;
    void fun(void)//C++中如果没有参数, 要填写 void, 不能空着
    {
        std::cout<<"B 中的 fun"<<std::endl;
    }
}
/*-----------------------使用方式1-----------------------------*/
int main()
{
    //fun();//错误, 不知道调用 A 命名空间的 fun 还是 B 命名空间的 fun
    A::fun();//调用 A 命名空间的 fun
    B::fun();//调用 B 命名空间的 fun
    A::num=10;
    B::num=20;
    std::cout<<"A 中的 num= "<<A::num<<std::endl;
    std::cout<<"B 中的 num= "<<B::num<<std::endl;
    return 0;
}
/*-----------------------使用方式2-----------------------------*/
using namespace B;
//using namespace A;
int main()
{
    //B::fun();
    fun();//如果使用 A 和 B 两个命名空间 fun 调用存在二意性
    return 0;
}

使用方式一:引用不同空间的变量和函数的时候需要带上命名空间和作用域运算符

使用方式二:使用之前用using声明所使用的命名空间,则可以直接引用所声明命名空间的变量和函数;若果同时使用using声明了两个命名空间,两个空间都有的变量和函数按方式一使用,某个命名空间独有的变量或函数也可直接使用

2、新的I/O流

I/O 流: 从某种 I/O 设备上输入或输出的字符序列

cout和cin是对象变量

cin 可以连续输入多个数据; cout 可以连续输出多个数据

默认情况下使用了系统缺省的格式, 但可以进行格式控制

endl 操作符号相当于C语言中的换行符

#include<iostream>
int main()
{
    //printf("name is %s\n","lucy");
    std::cout<<"name is"<<"lucy"<<std::endl;
    int num=0;
    //scanf("%d",&num);
    //std::cin 代表标准输入, 就是键盘
    std::cin>>num;
    std::cout<<"num= " <<num <<std::endl;
    char name[32]=" ";
    std::cin>>name;
    std::cout<<"name is "<<name<<std::endl;
    //scanf("%d %s",&num,name);
    std::cin>>num>>name;//200tom 也是可以的
    //不同变量的输入中间用空格隔开,整形和字符型时也可以不隔开直接连着输入
    std::cout<<"num= " <<num <<std::endl;
    std::cout<<"name is "<<name<<std::endl;
    return 0;
}

一个字符串中含有空格的话上述方式无法获取完整输入,需使用如下方式:

int main()
{
    char name[32]=" ";
    //std::cin>>name;//lucy tom 输入的话, 只获取 lucy, 遇到空格结束
    std::cin.getline(name,sizeof(name),'\n');
    //第三个参数可以不写。 第三个参数写了的话, 以第 3 个参数结束获取输入
    //getline 的方法, 字符串中间可以有空格
    //读取到name-1个字符或者遇到换行符就停止读取
    std::cout<<"name is "<<name<<std::endl;
    return 0;
}

在主函数前加上 using namespace std;  就可以省略上面的诸多std::

cout可以控制输出格式

int main()
{
    int num=100;
    cout<<"num= "<<dec<<num<<endl;//用十进制输出 num
    cout<<"num= "<<hex<<num<<endl;//用十六进制输出 num
    cout<<"num= "<<oct<<num<<endl;//用八进制输出 num
    return 0;
}

3、作用域运算符::

变量在程序中的起作用范围成为作用域;简单分为全局作用域、局部作用域和语句作用域;范围越小优先级越高,遵循就近原则;

如果希望在局部变量的作用域内使用同名的全局变量, 可以在该变量前加上”::”,”::” 称为作用域运算符

#include<iostream>
using namespace std;
int avar=10;
int main()
{
    int avar=20;
    cout<<"avar is : "<<avar<<endl;//用的是局部作用域
    avar=25;
    cout<<"avar is : "<<avar<<endl;
    cout<<"avar is : "<< ::avar <<endl;//用的是全局作用域
    ::avar = 30;
    cout<<"avar is : "<< ::avar <<endl;
    return 0;
}

4、C++中的结构体、共用体和枚举

定义方法和C语言一致,没有任何区别

但是在定义该类型变量时可以C++直接使用结构体、共用体或者枚举的类型名定义变量,而不用加上对应关键字

enum BOOL{FALSE,TRUE};

struct STRING{

                         char *prt;

                         int length;

                        };

在 c 语言中
                          enum BOOL done;
                          struct STRING str;

在 C++中
                          BOOL done;
                          STRING str;

C++中加上也行,并不会保存,但是习惯不加

5、const修饰符

const修饰符是只读的意思

用const修饰的普通变量不能再次赋值

const int *p=&data1;//不能通过 p 去改变 p 指向的变量的内容

                               //const 修饰的是 p, p 可以更改自身的指向, 但不能通过*p 去改变 p 指向的空间赋值

int * const p=&data1;//const 修饰 p, 代表 p 是个只读指针
                                         //不能改变 p 本身的指向, 但可以通过*p 改变 p 指向的空间的内容

const int * const p=&data1;//不能改变 p 本身的指向,也不能通过*p 改变 p 指向的空间的内容

以上三点在C语言和C++中是一样的

C语言中const修饰的变量可以通过一个指向该变量的指针进行修改,容易出现内存风险

但是在C++中不一样 如下:

#include<iostream>
using namespace std
int main()
{
    const int num=100;
    //int *p=&num;//类型不匹配,不强转, 在 C++里会报错
    int *p=(int *)&num;
    *p=300;
    cout<<"num= "<<num<<endl;
    //100,是符号常量表里的 num 的值, 而不是变量存储空间里的值, 变量存储空间里的值确实改为 300 
    cout<<"*p= "<<*p<<endl;//300
    cout<<&num<<endl;
    cout<<p<<endl;
    return 0;
}

 

SQL Prompt是Red Gate Software公司开发的一款强大的SQL代码编辑和优化工具,主要面向数据库开发者和管理员。版本11.0.1.16766是一个更新版本,它提供了更高效、更便捷的SQL编写环境,旨在提升SQL代码的可读性、效率和一致性。这个安装包包含了所有必要的组件,用于在用户的计算机上安装SQL Prompt工具。 SQL Prompt的核心功能包括自动完成、智能提示、格式化和重构。自动完成功能能够帮助用户快速输入SQL语句,减少键入错误;智能提示则基于上下文提供可能的选项,加快编写速度;格式化功能允许用户按照自定义或预设的编码规范对SQL代码进行美化,提升代码的可读性;而重构工具则可以帮助用户优化代码结构,消除潜在问题。 在描述中提到的“代码格式化规则来源于网络”,指的是用户可以通过下载网络上的json文件来扩展或定制SQL Prompt的代码格式化规则。这些json文件包含了特定的格式设置,如缩进风格、空格使用、注释位置等。将这些文件复制到指定的目录(例如:C:\Users\用户名\AppData\Local\Red Gate\SQL Prompt 10\Styles)后,SQL Prompt会读取这些规则并应用到代码格式化过程中,使得用户可以根据个人偏好或团队规范调整代码样式。 以下几点请注意: 1. 经实测,此版本支持最新的Sql Server 2022版的SSMS21 2. 此安装包中不包括keygen,请自行解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值