c++ initialization and reference

Initialization

What?: “Provides initial values at the time of construction” - cppreference.com

Direct initialization

#include <iostream>

int main(){
	int num1 = 12;
	int num2(12.0);
	std::cout<<"num1: "<<num1<<"  "<<"num2: "<<num2<<std::endl;
	return 0;
}
//num1: 12  num2: 12

12.0虽然不是int,但编译仍然会通过
direct initialization 会可能导致narrowing conversion,即窄化转换
这时就需要Uniform initialization

Uniform initialization

// 传统初始化允许窄化转换
int a = 3.14;    // 允许,但丢失精度
int b(3.14);     // 允许,但丢失精度

// 列表初始化禁止窄化转换
int c{3.14};     // 编译错误!窄化转换
int d = {3.14};  // 编译错误!窄化转换

// 允许的转换
int e{3};        // 允许,3 是整数,没有精度丢失
float f{3.0};    // 允许,3.0 是浮点数,没有精度丢失

Uniform initialization的优势

  • 安全,可以避免因为窄化转换带来的各种问题
  • 在vector,map等容器中也有许多应用

map


#include <iostream>
#include <map>
int main(){
	//uniform initialization of map
	std::map<std::string, int>mp = {
		{"anon",15},
		{"tomorin",16},
		{"soyo",15}
	};
	
	//Acessing map elements
	std::cout<<"tomorin's age: "<<mp["tomorin"]<<std::endl;
	std::cout<<"soyo's age: "<<mp["soyo"]<<std::endl;
	return 0;
}
tomorin's age: 16
soyo's age: 15

vector

#include <iostream>

#include <vector>

  

int main(){

    //uniform initialization of vector

    std::vector<int> nums = {1,2,3,4,5};

    //Acessing vector element

    for(int num:nums){

        std::cout<<num<<" ";

    }

    return 0;

}
1 2 3 4 5

List Initialization

#include <iostream>
struct student_info{
	std::string name;
	std::string school;
	int id_card;
}
int main(){
	//直接赋值
	student_info id1;
	id1.name = "saki";
	id1.school = "yuqiu"
	id.id_card = 168;
	//list initialization "=" 是可选的
	student_info id2 = {"taki", "huaxiaochuan", 114514};
	student_info id3  {"rena", "huaxiaochuan", 67908};
	
	std::cout<<id1.name<<" "<<id1.school<<" "<<id1.id_card<<std::endl;
	std::cout<<id2.name<<" "<<id2.school<<" "<<id2.id_card<<std::endl;
	std::cout<<id3.name<<" "<<id3.school<<" "<<id3.id_card<<std::endl;
}

saki yvqiu 168
taki huaxiaochuan 114514
rena huaxiaochuan 67908

Structured Binding(c++17)


#include <iostream>

#include <tuple>

  

std::tuple<std::string, std::string, int> getInfo() {

    std::string school = "HPU";

    std::string association = "HPUSEC";

    int classroom_id = 303;

    return {school, association, classroom_id};

}

  

int main(){

    auto info = getInfo();

    std::cout << "School: " << std::get<0>(info)

              << " Association: " << std::get<1>(info)

              << " Classroom ID: " << std::get<2>(info) << std::endl;

  

    auto [school, association, classroom_id] = getInfo();

    std::cout<<"School: "<<school

              << " Association: " << association

              << " Classroom ID: " << classroom_id

               << std::endl;

  

    return 0;

}
School: HPU Association: HPUSEC Classroom ID: 303
School: HPU Association: HPUSEC Classroom ID: 303
  • 在已知数据结构的大小时是一种有效的初始化办法
  • 能同时访问函数的多个返回值

const and reference

一个典型的reference错误

#include <iostream>

#include <math.h>

#include <vector>

void shift1(std::vector<std::pair<int, int>> &nums) {

for (auto [num1, num2] : nums) {

num1++;

num2++;

}

}

void shift2(std::vector<std::pair<int, int>> &nums) {

for (auto &[num1, num2] : nums) {

num1++;

num2++;

}

}

void shift3(std::vector<std::pair<int, int>> &nums) {

for (size_t i = 0; i < nums.size(); i++) {

nums[i].first++;

nums[i].second++;

}

}

void printNums(std::vector<std::pair<int, int>> &nums){

     for(auto[num1,num2]:nums){

        std::cout<<num1<<" "<<num2<<std::endl;

    }}

int main(){

    using it = std::vector<std::pair<int,int>>;

    it nums = {{1,2},{3,4}};

    shift1(nums);

    printNums(nums);

    shift2(nums);

    printNums(nums);

    shift3(nums);

    printNums(nums);

}
1 2
3 4
2 3
4 5
3 4
5 6

const


#include <iostream>

#include <vector>

int main()

{

std::vector<int> vec{ 1, 2, 3 }; /// a normal vector

const std::vector<int> const_vec{ 1, 2, 3 }; /// a const vector

std::vector<int>& ref_vec{ vec }; /// a reference to 'vec'

const std::vector<int>& const_ref{ vec }; /// a const reference

vec.push_back(3); /// this is ok!

const_vec.push_back(3); /// no, this is const!

ref_vec.push_back(3); /// this is ok, just a reference!

const_ref.push_back(3); /// this is const, compiler error!

return 0;

}

**不能声明对 const 变量的非 const 引用

#include <iostream>

#include <vector>

int main()

{

/// a const vector

const std::vector<int> const_vec{ 1, 2, 3 };

std::vector<int>& bad_ref{ const_vec }; /// BAD

return 0;

}
#include <iostream>
#include <vector>
int main()
{
/// a const vector
const std::vector<int> const_vec{ 1, 2, 3 };
const std::vector<int>& bad_ref{ const_vec }; /// Good!
return 0;
}
posted @ 2025-08-26 23:31  Civilight~Eterna  阅读(9)  评论(0)    收藏  举报