【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强

简介: <h1>1.类和对象</h1> <p>成员函数,成员变量,抽象封装的能力。</p> <p>求圆的面积;</p> <p></p> <pre code_snippet_id="584766" snippet_file_name="blog_20150120_1_4534440" name="code" class="objc">#include <iostream>usi

1.类和对象

成员函数,成员变量,抽象封装的能力。

求圆的面积;

#include <iostream>
using namespace std;
class circle{
private:
    double m_r;//成员变量
public:
    void setR(double r)//成员函数
    {
        m_r = r;
    }
    double getR()
    {
        return m_r;
    }
    double getS()
    {
        return 3.14*m_r*m_r;
    }
};
void main()
{
    circle c1;
    c1.setR(4);
    cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
    c1.setR(5);
    cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
    system("pause");
} 

2.命令空间

命名空间;c++对c的扩展。解决标识符冲突。
std::out  :: 域作用符。
#include <iostream>
namespace NameSpaceA{
    int a = 0;
}
namespace NameSpaceB{
    int a = 1;
    namespace NameSpaceC{
        struct Teacher{
            char name[10];
            int age;
        };
    }
}
void main()
{
    using namespace NameSpaceA;
    printf("NameSpaceA:a=%d\n", a);
    printf("NameSpaceB:a=%d\n", NameSpaceB::a);
    using NameSpaceB::NameSpaceC::Teacher;
    Teacher t1 = { "aaa", 3 };
    printf("t1.name = %s\n", t1.name);
    printf("t1.age = %d\n", t1.age);
    system("pause");
} 



3.语法增强

3.1register关键字增强 

int main()
{
    register int a = 0;
    printf("&a = %x\n", &a);
    system("pause");
    return 0;
} 

//register关键字 请求编译器让变量a直接放在寄存器里面,速度快

//c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容

register关键字的变化

register关键字请求“编译器”将局部变量存储于寄存器中

C语言中无法取得register变量地址

C++中依然支持register关键字

C++编译器有自己的优化方式,不使用register也可能做优化

C++中可以取得register变量的地址 

3.2struct类型增强

struct类型的加强:

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

C++中的struct是一个新类型的定义声明

struct Student

{

    char name[100];

    int age;

};

 

int main(int argc, char *argv[])

{

    Student s1 = {"wang", 1};//struct Student s1={};

    Student s2 = {"wang2", 2};    

    return 0;

}


4.三目运算符

#include <iostream>
using namespace std;

//在c++里面的三目运算符 返回是一个变量
//让表达式做左值 
//1 左值 能被放在 = 做值 称为左值  
//2 当左值的条件, 这段内存空间可以被你写

int main()
{
	int a = 10;
	int b = 20;
	int c = 31;

	//返回一个最小数 并且给最小数赋值成30
	//三目运算符是一个表达式 ,表达式不可能做左值
	//让表达式做左值 
	(a < b ? a : b) = 30;//相当于c中的*((a < b ? &a : &b)) = 30;
	//在c中编译不过,报错
	printf("a = %d, b = %d\n", a, b);

	system("pause");

	return 0;
}


5.const专题


const 定义的变量, 在c++的编译器中, 做了一个符号表, key <--->value | a<-->10;
修改的时候, 只是修改了重新分配的空间, 对原来的const数据没有造成修改。
而在c中,却可以将const常量进行修改。

6.引用专题

    引用在c++内部是一个常量指针。
type &name <---> type * const name;
引用的本质是c++编译器帮我们做了一个取地址的操作。
#include <iostream>
using namespace std;

void swap(int &a, int &b)
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}

void swap2(int *a, int *b)
{
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}
//引用和左值进行绑定的时候
void main()
{
	int a1 = 10; int b1 = 20;
	swap(a1, b1);
	printf("a1:%d, b1:%d", a1, b1);
	system("pause");
}

7.函数增强

7.1内联函数

内联函数的函数体需要和实现写在一起,不能单独声明。
代替带参数的宏,避免宏的副作用。
#include "iostream"
using namespace std;

#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
//inline请求关键字, 内联编译
//内联函数的函数体,需要和实现写在一块
inline int myfunc(int a, int b)
{
	return a < b ? a : b;
}

int main()
{
	int a = 1;
	int b = 3;
	//int c = myfunc(++a, b); 
	int c = MYFUNC(++a, b);//===> ((++a) < (b) ? (++a) : (b));

	printf("a = %d\n", a); //3
	printf("b = %d\n", b);//3
	printf("c = %d\n", c); //3

	system("pause");
	return 0;
}

7.2函数重载

函数重载与函数指针的结合;可以添加断电,选择逐语句执行,观察运行效果。
#include "iostream"
using namespace std;

int func(int x) // int(int a)
{
	return x;
}

int func(int a, int b)
{
	return a + b;
}

int func(const char* s)
{
	return strlen(s);
}

//定义了一个  指针  类型 (指向函数的指针类型)
typedef int(*PFUNC)(int a); // int(int a)

void main()
{
	PFUNC p = func;
	int c = p(1);

	printf("c = %d\n", c);
	system("pause");
}




目录
相关文章
|
5天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
29 0
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
79 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
37 0
C++ 多线程之线程管理函数
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
60 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
24天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
31 4